使用IF语句与FORTH生成"解释一个只编译的单词"

时间:2018-02-19 05:21:58

标签: if-statement forth gforth

我正在阅读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 -1true 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.

这里发生了什么?

3 个答案:

答案 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 ;。一些实现允许交互式使用,但它远非普遍。