我正在阅读Starting Forth: 4. Decisions, Decisions...。我可以运行assemblyMergeStrategy in assembly := {
case PathList("META-INF", xs @ _*) => MergeStrategy.discard
case x => MergeStrategy.first
}
42 42 = .
可以预见,42 42 = ok
42 42 = . -1 ok
-1
为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:
$7F7539250B30 throw
能够输出,而不是。{}相反,我得到
Cannot securely connect to this page
This might be because the site uses outdated or unsafe TLS security settings. If this keeps happening, try contacting the website’s owner.
Your TLS security settings aren’t set to the defaults, which could also be causing this error.
这里发生了什么?
答案 0 :(得分:2)
我认为这些必须被编译成单词,无论出于什么原因,表达式都不是原语。我相信在书中引用了这个,
注意:
IF…THEN
语句必须包含在定义中。您不能只在“计算器风格”中输入这些单词。
所以它看起来像这样,
: mycond 42 = IF ." foobar " THEN ; ok
42 .s <1> 42 ok
mycond foobar ok
42 mycond foobar ok
这又是gforth docs on Conditional execution
在Forth中,您只能在冒号定义中使用控制结构。 if结构如下所示:
答案 1 :(得分:1)
完全结构化的单词仅编译为单词用法 for loops / if / while ... until&amp;等等......
仅使用Gforth文档。这是最好的一个。我的意思是使用Gforth ......否则你可能会遇到很难的例子或其他Forth解释器特定的单词,不包括在ANSI Forth和gnuforth中。
答案 2 :(得分:0)
FORTH标准说控制结构(IF,ELSE,THEN; DO,LOOP等等)仅用于编译使用,交互式使用是一种模糊的情况&#34 ;。一些实现允许交互式使用,但它远非普遍。