我目前正在开发一个用 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 ) @ + ;
关于compilation - 在编译字中编译匿名字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19363904/