为什么 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
继续..."
或者更好的是,使用引号(如Factor,RetroForth,...),在这种情况下,它完全是后缀,没有特殊的编译时单词;只是从堆栈中获取地址的常规单词:[ do this ] [ do that ] if
或[ do this ] when
或[ do that ] unless
。我个人更喜欢这个。
旁谈:引文
以下是在RetroForth中编译引文的方式。在我自己的 Forth(编译到我自己的 VM)中,我只是添加了一个 QUOTE
指令,该指令将下一个地址推送到堆栈并跳过 n 字节。n字节应由RETURN
指令终止,if
、when
、unless
词使用谓词以及前面引号留下的地址;酌情调用。确实非常简单,引文通常为各种美丽的抽象打开了大门,而不是考虑堆栈。