将 IF 语句与 FORTH 一起使用会产生 "Interpreting a compile-only word"

USING IF Statement with FORTH produces "Interpreting a compile-only word"

我正在阅读 Starting Forth: 4. Decisions, Decisions...。我可以运行42 42 = .

42 42 =  ok
42 42 = . -1  ok

不出所料,我得到 -1,即 two's compliment 对应 true。但是,如果我将 42 压入堆栈,并且 运行

42 .s
42 = IF ." foobar " THEN ; 

我希望输出 foobar,但没有。相反,我得到

    42 .s <1> 42  ok
    42 = IF ." foobar " THEN ;  
:2: Interpreting a compile-only word
    42 = >>>IF<<< ." foobar " THEN ; 
Backtrace:
F7539250B30 throw 

这是怎么回事?

我相信这些必须被编译成单词,无论出于何种原因,表达式都不是原始的。我相信这在书中有引用,

Notice: an IF…THEN statement must be contained within a definition. You can’t just enter these words in “calculator style.”

所以它看起来像这样,

: mycond 42 = IF ." foobar " THEN ;   ok
42 .s <1> 42  ok
mycond foobar  ok
42 mycond foobar  ok

这又是在 gforth docs on Conditional execution

In Forth you can use control structures only inside colon definitions. An if-structure looks like this:

完全结构化的词只是编译词用法 for 循环 / if / while...until 等等....

仅使用 Gforth 文档。这是最好的。我的意思是使用 Gforth ... 否则你可能会遇到不好的例子或其他 Forth 解释器特定的单词,这些单词不包括在 ANSI Forth 或 gnuforth 中。

FORTH 标准规定控制结构(IF、ELSE、THEN;DO、LOOP;等等)仅供编译使用,交互式使用是"ambiguous situation".一些实现允许交互式使用,但远非通用。