2012-09-22 76 views
6

爲什麼Forth使用IF語句THEN ...而不是ENDIF?爲什麼Forth使用IF語句THEN ...而不是ENDIF?

我實現(不符合要求)規定的編譯器的東西。基本上,對於IF語句,Forth的語法對我來說顯得非常不直觀。

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

爲什麼結尾語句是THEN?這使得我的語言閱讀非常怪異。對於我的編譯器,我正在考慮將其更改爲類似ENDIF的內容,該內容更自然。但是,首先倒退IF-THEN陳述的原因是什麼?

+0

有沒有人認爲這會更適合programmers.se? – Earlz

+1

你必須問問查克摩爾。沒有人會知道答案。 [他在這裏說他什麼時候介紹了「有時候被批評的postfix條件」](http://www.colorforth.com/HOPL.html)。 –

+0

如果我沒有太大誤解,那麼(或者可能是)實現(不能完全記得目前的哪一個,對不起)ENDIF被定義爲THEN的一種同義詞,這意味着你並不是第一個找到'IF-ELSE-THEN'的順序有點太不尋常了。不過,我從來沒有遇到過問題。 (我想很久以前我在一些書中看到了它的解釋,並且這符合@AshleyF在他的回答中的說法。) –

回答

6

只是把它當做「IF是這樣的情況下,做到這一點,ELSE做...和THEN繼續......」

或者更好的是,使用價格(如FactorRetroForth, ...),在這種情況下,它完全是後綴,沒有特殊的編譯時間字;只是從堆棧中獲取地址的常規單詞:[ do this ] [ do that ] if[ do this ] when[ do that ] unless。我個人更喜歡這個。

除了RE:報價

這裏是how quotations are compiled in RetroForth。在我自己的Forth(編譯爲我自己的VM)中,我簡單地添加了一條QUOTE指令,將下一個地址壓入堆棧並跳過n字節。預計該n字節由RETURN指令終止,ifwhenunless詞語消耗與由前述報價留下的地址(ES)沿一個謂語;酌情打電話。確實非常簡單,報價通常爲all kinds of beautiful abstractions away from thinking about the stack打開大門。

+0

我從來沒有聽說過報價!這看起來像一個很好的抽象機制。當我第一次設置了在這個項目上我不知道是否有人甚至有可能在第四 – Earlz

+1

匿名函數這可能會或可能並不適用於這種情況,而是「串連語言的喜悅」第1部分([第1]( http://www.codecommit.com/blog/cat/the-joy-of-concatenative-languages-part-1),[Part 2](http://www.codecommit.com/blog/cat/the-歡快的連接語言部分2),[部分3](http://www.codecommit.com/blog/cat/the-joy-of-concatenative-languages-part-3))指出:「條件乍一看看起來很怪異,但在表面下它們非常優雅......「 –

+0

我在思考過一點之後就遇到了一個問題。如果你想如何實現類似'1 [10] [20]的函數''期望的輸出結果應該是'10'..但是,它會導致堆棧出現問題,當引用「返回」時,它將返回到10 ''或'20'這是不對的。或者,這是否應該通過次級「隱藏」調用堆棧來實現這種內部回報? – Earlz