2012-09-22 9 views
6

Warum verwendet Forth IF-Anweisung THEN ... anstelle von ENDIF?Warum verwendet Forth IF-Anweisung THEN ... anstelle von ENDIF?

Ich implementiere eine (nicht konforme) Forth-Compiler-Sache. Grundsätzlich scheint mir die Forth-Syntax bei IF-Anweisungen sehr kontraintuitiv zu sein.

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

Warum ist die Endung Aussage ein THEN? Das macht die Sprache extrem komisch für mich. Für meinen Compiler überlege ich, es zu etwas wie ENDIF zu ändern, das natürlicher liest. Aber was war der Grund dafür, IF-THEN-Statements überhaupt erst einmal zu hinterfragen?

+0

Glaubt jemand, dass dies besser für programmers.se geeignet wäre? – Earlz

+1

Sie müssen Chuck Moore fragen. Niemand sonst wird die Antwort wissen. [Hier steht er, als er "Das irgendwann kritisierte Postfix-Konditional" einführte (http://www.colorforth.com/HOPL.html). –

+0

Wenn ich nicht viel falsch bin, gibt es (oder vielleicht waren) Implementierungen (kann mich nicht ganz erinnern, was im Moment, Entschuldigung) wo ENDIF als eine Art Synonym von THEN definiert wurde, was bedeutet, dass Sie nicht zuerst sind die Sequenz von "IF-ELSE-THEN" etwas zu ungewöhnlich zu finden. Ich, ich hatte nie ein Problem damit. (Ich denke, ich sah eine Erklärung dafür in einem Buch vor langer Zeit, und es war in der Art von @AshleyF hat in seiner Antwort gesagt.) –

Antwort

6

Man denke nur an sie als "IF das der Fall ist, dies zu tun, ELSE das tun ... und THEN weiter mit ..."

Oder noch besser, verwenden Zitate (wie in Factor, RetroForth, ...) in diesem Fall ist es komplett ohne spezielle Compfix-Zeit Wörter postfix; nur normale Wörter, die Adressen vom Stapel nehmen: [ do this ] [ do that ] if oder [ do this ] when oder [ do that ] unless. Ich persönlich bevorzuge das sehr.

Neben RE: Zitate

Hier how quotations are compiled in RetroForth ist. In meiner eigenen Forth (die zu meiner eigenen VM kompiliert), fügte ich einfach einen QUOTE Befehl hinzu, der die nächste Adresse an den Stack weiterleitet und über N-Bytes springt. Es wird erwartet, dass die n Bytes durch einen RETURN Befehl beendet werden und die if, when, unless Wörter ein Prädikat zusammen mit der (den) Adresse (n), die von vorhergehenden Zitaten übrig sind, verbrauchen; wenn nötig anrufen. In der Tat sehr einfach, und Zitate öffnen allgemein die Tür für all kinds of beautiful abstractions away from thinking about the stack.

+0

Ich habe noch nie von Zitaten gehört! Das sieht jedoch nach einem ausgezeichneten Abstraktionsmechanismus aus. Als ich mich zum ersten Mal mit diesem Projekt beschäftigte, fragte ich mich, ob es überhaupt möglich wäre, anonyme Funktionen in Forth zu haben. – Earlz

+1

Dies kann oder kann nicht auf diese Situation zutreffen, aber Teil 1 von "Die Freude der Verkettungssprachen" ([Teil 1] (http://www.codecommit.com/blog/cat/the-joy-of-concatenative-languages-part-1), [Teil 2] (http://www.codecommit.com/blog/cat/the- (2), [Teil 3] (http://www.codecommit.com/blog/cat/the-joy-of-concatenative-languages-part-3)): Conditionals sehen auf den ersten Blick auch ziemlich komisch aus, aber unter der Oberfläche sind sie zutiefst elegant ... " –

+0

Ich habe ein Problem damit, nachdem ich ein bisschen mehr darüber nachgedacht habe. Wie würden Sie etwas wie '1 [10] [20] if.' Implementieren? Die erwartete Ausgabe sollte '10' sein. Aber, es bringt den Stapel aus der Reihe und wenn das Zitat "zurückkehrt", kehrt es entweder zu '10 zurück oder 20, das ist nicht richtig. Oder sollte dies nur mit einem sekundären "versteckten" Call-Stack für solche internen Rückgaben implementiert werden? – Earlz

Verwandte Themen