是否可以在 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

请注意,此版本在定义之外不再有效。