在 Forth 中执行一个 char 或 string 就像它是一个词一样
Executing a char or string in Forth as though it was a word
假设我在某处存储了 s" Hello"
。我还定义了 : Hello something ;
。有没有办法像执行单词一样执行字符串?
我已阅读文档,但找不到任何相关功能。这可能很明显,但可惜我无法解决。
这适用于我的系统。
s" Hello" EVALUATE
注意:EVALUATE
interprets(翻译)一个字符串。这意味着在编译状态下,您的 "Hello" 将被 编译 。例如:
: foo s" hello" evaluate ;
: [foo] foo ; immediate
: hello ." something" ;
: bar [foo] ; \ "hello" will be compiled into bar
bar \ will execute hello
另一种方法是使用SEARCH-WORDLIST
or FIND-NAME
字,例如:
s" hello" find-name dup ?nf name> execute
在哪里
find-name ( c-addr u -- nt|0 ) \ returns a name token nt or 0
?nf ( nt|0 -- ) \ throws an exception on zero, i.e. not found
name> ( nt -- xt )
最后两个在Gforth中可以定义为
: ?nf ( x|0 -- ) if exit then -13 throw ;
: name> ( nt -- xt|0 )
dup name>interpret swap name>compile drop over = if exit then drop 0
;
假设我在某处存储了 s" Hello"
。我还定义了 : Hello something ;
。有没有办法像执行单词一样执行字符串?
我已阅读文档,但找不到任何相关功能。这可能很明显,但可惜我无法解决。
这适用于我的系统。
s" Hello" EVALUATE
注意:EVALUATE
interprets(翻译)一个字符串。这意味着在编译状态下,您的 "Hello" 将被 编译 。例如:
: foo s" hello" evaluate ;
: [foo] foo ; immediate
: hello ." something" ;
: bar [foo] ; \ "hello" will be compiled into bar
bar \ will execute hello
另一种方法是使用SEARCH-WORDLIST
or FIND-NAME
字,例如:
s" hello" find-name dup ?nf name> execute
在哪里
find-name ( c-addr u -- nt|0 ) \ returns a name token nt or 0
?nf ( nt|0 -- ) \ throws an exception on zero, i.e. not found
name> ( nt -- xt )
最后两个在Gforth中可以定义为
: ?nf ( x|0 -- ) if exit then -13 throw ;
: name> ( nt -- xt|0 )
dup name>interpret swap name>compile drop over = if exit then drop 0
;