是否可以在 Forth 定义中使用 tick?
Is it possible to consume tick in a Forth definition?
在阅读有关 tick ('
) 运算符时,我想知道它在单词定义中是否有用。我知道在定义中要使用 ['] ,但我想过用它来读取调用后的单词名称。
一个例子:
4 variable cnt
: cycle: ( arg fn -- )
'
4 cnt !
begin
cr
dup execute
-1 cnt +!
cnt @ 0 = until
drop
;
我可以用cycle:
重复一些单词调用,如下。
: hello ." hello" ;
cycle: hello
如预期的那样打印了四次 hello
。
但是下面的代码不会定义打印四次 hello
的单词:
: 4hello cycle: hello ;
在调用 4hello
.
之后,滴答运算符仍然需要来自输入流的单词
是否可以在单词定义中使用 cycle:
时以某种方式注入它,所以它不会 "leak" 在外面?
是的,这是可能的。您必须立即执行 cycle:
。然后还更改它以推迟其操作,而不是在运行时执行它们。
推迟就是延迟言语的动作。立即词编译到当前定义中,普通词安排在当前定义执行时编译。
在这种情况下,它可能看起来像这样。
: (cycle) 4 0 do dup execute loop drop ;
: cycle: ' postpone literal postpone (cycle) ; immediate
请注意,此版本在定义之外不再有效。
在阅读有关 tick ('
) 运算符时,我想知道它在单词定义中是否有用。我知道在定义中要使用 ['] ,但我想过用它来读取调用后的单词名称。
一个例子:
4 variable cnt
: cycle: ( arg fn -- )
'
4 cnt !
begin
cr
dup execute
-1 cnt +!
cnt @ 0 = until
drop
;
我可以用cycle:
重复一些单词调用,如下。
: hello ." hello" ;
cycle: hello
如预期的那样打印了四次 hello
。
但是下面的代码不会定义打印四次 hello
的单词:
: 4hello cycle: hello ;
在调用 4hello
.
是否可以在单词定义中使用 cycle:
时以某种方式注入它,所以它不会 "leak" 在外面?
是的,这是可能的。您必须立即执行 cycle:
。然后还更改它以推迟其操作,而不是在运行时执行它们。
推迟就是延迟言语的动作。立即词编译到当前定义中,普通词安排在当前定义执行时编译。
在这种情况下,它可能看起来像这样。
: (cycle) 4 0 do dup execute loop drop ;
: cycle: ' postpone literal postpone (cycle) ; immediate
请注意,此版本在定义之外不再有效。