当阅读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:
时,是否有可能以某种方式注入它,因此它不会泄漏"泄漏"外部
答案 0 :(得分:3)
是的,这是可能的。你必须立即cycle:
。然后还将其更改为推迟其操作,而不是在运行时执行它们。
推迟意味着延迟言行。立即字被编译到当前定义中,并且正常字被安排在当前定义执行时被编译。
在这种情况下,它可能看起来像这样。
: (cycle) 4 0 do dup execute loop drop ;
: cycle: ' postpone literal postpone (cycle) ; immediate
请注意,此版本不再适用于定义之外。