在 Forth 中,如果我两次调用 DOES> 会发生什么?

In Forth, what happens if I call DOES> twice?

John Hayes 的 ANS Forth 测试套件包含如下所示的测试:

: WEIRD: CREATE DOES> 1 + DOES> 2 + ; 
WEIRD: W1
W1

我完全不知道这究竟应该做什么。 DOES> 上的 ANS Forth Specification 在很大程度上是难以理解的。

从阅读测试套件来看,它似乎期待第一次调用 DOES> 来修改 W1,但随后调用 W1 激活了 第二个DOES>。我假设第二个操作对最近调用 CREATE 定义的词进行操作,但它已经 DOES> 化,所以我不确定它应该做什么。

gforth 通过了测试套件,所以测试似乎是有效的;但是我的宠物 Forth 解释器没有,我需要弄清楚如何让它工作...

第二次调用 DOES> 也修改了 W1.

WEIRD: 使用 1 + DOES> 2 + 的运行时操作创建 W1。第一次调用 W1 将运行时设置为 2 +.

如果您更改代码以打印某些内容,这将更加明显,例如

: weird:   create  does> drop ." ONE"  does> drop ." TWO" ; ok
weird: w1 ok
w1 ONE ok
w1 TWO ok
w1 TWO ok
w1 TWO ok

对此的解释是DOES>总是对最新定义的词进行操作。