我目前正在研究一个用 Forth 编写的小型解释器。对于一个小的优化,我试图有一个创建编译词的词。例如,行为如下:
: creator ( -- a )
:noname ( u -- u )
10 + ;
;
10 creator execute .
>> 20 ok
到目前为止,我尝试了几种方法,但都没有奏效(像上面那样天真,切换到解释模式,尝试编译 Forth 源字符串)。这真的可能吗?
我目前正在研究一个用 Forth 编写的小型解释器。对于一个小的优化,我试图有一个创建编译词的词。例如,行为如下:
: creator ( -- a )
:noname ( u -- u )
10 + ;
;
10 creator execute .
>> 20 ok
到目前为止,我尝试了几种方法,但都没有奏效(像上面那样天真,切换到解释模式,尝试编译 Forth 源字符串)。这真的可能吗?
当你编写编译字时,你必须非常小心哪些字在编译时执行,哪些在运行时执行。在这种情况下,10 +
在编译时运行,并且不会编译到你的 :noname 定义中。
我相信这就是你想要的:
: creator ( -- xt ) :noname ( n1 -- n2 )
10 postpone literal postpone + postpone ; ;
另请注意,您可以在许多情况下使用 CREATE DOES>。例如,如果您希望您creator
接受子词使用的数字:
: creator ( n1 "name" -- ) create ,
does> ( n2 -- n1+n2 ) @ + ;