在 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>
总是对最新定义的词进行操作。
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>
总是对最新定义的词进行操作。