history - 为什么 Forth 使用 IF 语句 THEN ... 而不是 ENDIF?

标签 history language-design forth

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果你觉得这个问题可以改进并可能重新打开,visit the help center 寻求指导。




8年前关闭。




为什么 Forth 使用 IF 语句 THEN ... 而不是 ENDIF?

我正在实现一个(不符合标准的)Forth 编译器。基本上,关于 IF 语句,Forth 的语法对我来说似乎非常违反直觉。

IF ."Statement is true"
ELSE ."Statement is not true"
THEN ."Printed no matter what;

为什么结束语句是 THEN ?这让我觉得这门语言读起来很奇怪。对于我的编译器,我正在考虑将其更改为 ENDIF 之类的内容,这样读起来更自然。但是,首先向后的 IF-THEN 语句背后的基本原理是什么?

最佳答案

把它想象成,“IF 是这样,这样做,ELSE 这样做......而THEN 继续......”

或者更好的是,使用引号(如 FactorRetroForth ,...)在这种情况下,它完全是后缀,没有特殊的编译时词;只是从堆栈中获取地址的常规单词: [ do this ] [ do that ] if[ do this ] when[ do that ] unless 。我个人更喜欢这个。

旁白:引用

这是 how quotations are compiled in RetroForth 。在我自己的 Forth(编译为我自己的 VM)中,我只是添加了一条 QUOTE 指令,该指令将下一个地址压入堆栈并跳过 n 字节。 n 字节预计由 RETURN 指令终止,ifwhenunless 字消耗谓词以及前面引用留下的地址;酌情调用。确实非常简单,报价通常为 all kinds of beautiful abstractions away from thinking about the stack 敞开大门。

关于history - 为什么 Forth 使用 IF 语句 THEN ... 而不是 ENDIF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12539634/

相关文章:

regex - 在 vim 的正则表达式引擎中,为什么有些元字符会被转义而有些则不会?

netbeans - 在 NetBeans 中启用本地历史记录

C 函数调用后跟逗号分隔符

java - 为什么 Java 不允许 Throwable 的泛型子类?

lisp - Common Lisp 宏和 Forth 元编程能力的比较

.net - 自 .Net 2.0 以来,.Net IL 是否发生了变化?

programming-languages - 编程语言中的新思想在哪里?

java - 为什么 Java 不对 a == "something"发出警告?

bit-shift - 第四为什么负 LSHIFT 会这样表现?

macos - 将 JonesForth 移植到 macOS v10.15 (Catalina)