Olle Härstedt Asked: 2023-11-05 16:11:18 +0800 CST2023-11-05 16:11:18 +0800 CST 2023-11-05 16:11:18 +0800 CST 在 Forth 中从堆栈上的字符串创建一个新单词 772 我需要使用create从 获得的字符串parse-name。可能的?也许用这个词evaluate? forth 2 个回答 Voted Best Answer ruvim 2023-11-05T18:43:04+08:002023-11-05T18:43:04+08:00 要以编程方式创建命名定义,您有以下选项: 允许定义词从输入流中获取名称; 使用众所周知的词execute-parsing; 组成一个字符串并将其传递给evaluate. 1. 使用定义词 如果您需要创建一个具有parse-name返回名称的单词,只需使用通常的定义单词而不是parse-name。 : foo ( "name" -- ) create 123 , ; foo bar \ it creates "bar" bar @ . \ it prints "123" 2. 使用execute-parsing 有一个众所周知的单词execute-parsing ( i*x c-addr u xt -- j*x ),它是由某些系统提供的,或者可以从符合标准的库加载,例如execute-parsing.fs。 该字执行给定的 xt,提供给定的字符串作为输入缓冲区。当您以编程方式编写名称时,该单词会很有用。 : foo ( "name" -- ) parse-name ['] create execute-parsing 123 , ; 3. 组成字符串 组成字符串的标准方法太低级:分配内存区域并使用 放置子字符串move ( addr.src addr.dest u.length -- )。因此,更好的方法是使用一些库(例如ffl/str.fs)。 组成短字符串的另一种方法是使用如图所示的数字输出机制和单词 holds ( c-addr u -- ): : foo ( "name" -- ) <# parse-name holds s" create " holds 0 0 #> evaluate 123 , ; 在这种机制中,新的子字符串前置于前一个子字符串(即,它们从右到左放入缓冲区)。 可用缓冲区大小可以通过以下方式获得: s" /HOLD" environment? 0= throw . 返回的字符串#> ( xd -- c-addr u )是瞬态的。 当您使用 时evaluate,您必须确保所有名称都将被正确解析(由于后期绑定)。 Olle Härstedt 2023-11-05T16:52:29+08:002023-11-05T16:52:29+08:00 也许是这样的: s" create " parse-name foo $+ evaluate
要以编程方式创建命名定义,您有以下选项:
execute-parsing
;evaluate
.1. 使用定义词
如果您需要创建一个具有
parse-name
返回名称的单词,只需使用通常的定义单词而不是parse-name
。2. 使用
execute-parsing
有一个众所周知的单词
execute-parsing ( i*x c-addr u xt -- j*x )
,它是由某些系统提供的,或者可以从符合标准的库加载,例如execute-parsing.fs。该字执行给定的 xt,提供给定的字符串作为输入缓冲区。当您以编程方式编写名称时,该单词会很有用。
3. 组成字符串
组成字符串的标准方法太低级:分配内存区域并使用 放置子字符串
move ( addr.src addr.dest u.length -- )
。因此,更好的方法是使用一些库(例如ffl/str.fs)。组成短字符串的另一种方法是使用如图所示的数字输出机制和单词
holds ( c-addr u -- )
:在这种机制中,新的子字符串前置于前一个子字符串(即,它们从右到左放入缓冲区)。
可用缓冲区大小可以通过以下方式获得:
返回的字符串
#> ( xd -- c-addr u )
是瞬态的。当您使用 时
evaluate
,您必须确保所有名称都将被正确解析(由于后期绑定)。也许是这样的: