是否有可能在Forth定义中使用tick?

时间:2018-01-29 22:22:42

标签: forth

当阅读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之后,tick操作符仍然需要来自输入流的单词。

在单词定义中使用cycle:时,是否有可能以某种方式注入它,因此它不会泄漏"泄漏"外部

1 个答案:

答案 0 :(得分:3)

是的,这是可能的。你必须立即cycle:。然后还将其更改为推迟其操作,而不是在运行时执行它们。

推迟意味着延迟言行。立即字被编译到当前定义中,并且正常字被安排在当前定义执行时被编译。

在这种情况下,它可能看起来像这样。

: (cycle)   4 0 do dup execute loop drop ;
: cycle:   ' postpone literal postpone (cycle) ; immediate

请注意,此版本不再适用于定义之外。