2012-09-22 15 views
6

Perché Forth usa l'istruzione IF THEN ... invece di ENDIF?Perché Forth usa l'istruzione IF THEN ... invece di ENDIF?

Sto implementando una cosa del compilatore Forth (non conforme). Fondamentalmente, la sintassi di Forth sembra molto controintuitiva per quanto riguarda le dichiarazioni IF.

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

Perché è la fine di un comunicato THEN? Questo rende la lingua estremamente strana per me. Per il mio compilatore, sto considerando di cambiarlo in qualcosa come ENDIF che legge più naturale. Ma quale era la logica alla base delle dichiarazioni IF-THEN al contrario?

+0

Qualcuno pensa che questo sarebbe più adatto per programmers.se? – Earlz

+1

Dovrai chiedere a Chuck Moore. Nessun altro saprà la risposta. [Qui afferma quando ha introdotto "Il condizionale postfatto da criticare a volte"] (http://www.colorforth.com/HOPL.html). –

+0

Se non mi sbaglio molto, ci sono (o forse erano) implementazioni (non ricordo abbastanza quale al momento, mi dispiace) dove ENDIF è stato definito come una sorta di sinonimo di THEN, il che significa che non sei il primo trovare la sequenza di "IF-ELSE-THEN" un po 'troppo insolita. Io, non ho mai avuto problemi con questo, però. (Penso di averne visto una spiegazione in qualche libro molto tempo fa, ed è stato proprio sulla falsariga di @AshleyF nella sua risposta.) –

risposta

6

Basti pensare a come, "IF questo è il caso, fare questo, ELSE farlo ... e THEN continuare con ..."

O meglio ancora, utilizzare le citazioni (come in Factor, RetroForth, ...) nel qual caso è completamente postfix senza speciali parole in fase di compilazione; solo parole regolari che prendono gli indirizzi dallo stack: [ do this ] [ do that ] if o [ do this ] when o [ do that ] unless. Personalmente preferisco di gran lunga questo.

Oltre Re: citazioni

Ecco how quotations are compiled in RetroForth. Nel mio Forth (che compila la mia VM), ho semplicemente aggiunto un'istruzione QUOTE che spinge il prossimo indirizzo nello stack e salta su n-byte. Gli n byte dovrebbero terminare con un'istruzione RETURN e le parole if, when, unless consumano un predicato insieme all'indirizzo (i) lasciato dalle quotazioni precedenti; chiamando come appropriato. Molto semplice, infatti, e le citazioni generalmente aprono la porta per all kinds of beautiful abstractions away from thinking about the stack.

+0

Non ho mai sentito parlare di quotazioni! Però sembra un eccellente meccanismo di astrazione. Quando ho iniziato questo progetto mi chiedevo se fosse possibile avere funzioni anonime in Forth – Earlz

+1

Questo può o non può essere applicato a questa situazione, ma la parte 1 di "The Joy of Concatenative Languages" ([Parte 1] (http://www.codecommit.com/blog/cat/the-joy-of-concatenative-languages-part-1), [Parte 2] (http://www.codecommit.com/blog/cat/the- joy-of-concatenative-languages-part-2), [Part 3] (http://www.codecommit.com/blog/cat/the-joy-of-concatenative-languages-part-3)) afferma: " Anche i condizionali sembrano piuttosto strani a prima vista, ma sotto la superficie sono profondamente eleganti ... " –

+0

Ho avuto un problema dopo averlo pensato un po 'di più. Come implementereste qualcosa come '1 [10] [20] se .' L'output atteso dovrebbe essere' 10' .. Ma, ottiene lo stack fuori linea e quando la citazione "ritorna", ritorna a '10 'o' 20' che non è giusto. Oppure dovrebbe essere implementato con uno stack di chiamate "nascosto" secondario per tali rendimenti interni? – Earlz