在Forth中编译已编译单词中的匿名单词

时间:2013-10-14 15:36:54

标签: compilation word metaprogramming forth

我目前正在研究一个用Forth编写的小型翻译。对于一个小的优化,我试图创建一个创建编译单词的单词,例如,行为如下:

: creator ( -- a )
    :noname ( u -- u )
        10 + ;
;

10 creator execute .
>> 20 ok

如果尝试了几种方法到目前为止并且没有工作(如上所述,切换解释模式,尝试编译一串Forth源)。这实际上是可能的吗?

1 个答案:

答案 0 :(得分:3)

编写单词时,必须非常小心哪些单词在编译时执行,哪些单词在运行时执行。在这种情况下,10 +在编译时运行,并且不会编译到您:noname定义。

我相信这就是你想要的:

: creator ( -- xt )   :noname ( n1 -- n2 )
   10 postpone literal  postpone +  postpone ; ;

另请注意,您可以使用CREATE DOES>在很多情况下。例如。如果您希望creator接受子词使用的数字:

: creator ( n1 "name" -- )   create ,
   does> ( n2 -- n1+n2 )   @ + ;