2012-09-22 11 views
6

¿Por qué Forth usa IF statement THEN ... en lugar de ENDIF?¿Por qué usa Forth IF ENTONCES ... en lugar de ENDIF?

Estoy implementando un compilador Forth (no conforme). Básicamente, la sintaxis de Forth parece muy contraintuitiva para mí con respecto a las declaraciones IF.

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

¿Por qué es la declaración poniendo fin a una THEN? Esto hace que el lenguaje sea extremadamente extraño para mí. Para mi compilador, estoy considerando cambiarlo a algo como ENDIF que dice más natural. Pero, ¿cuál era la razón detrás de tener declaraciones IF-THEN al revés en primer lugar?

+0

¿Alguien piensa que esto sería más adecuado para los programadores.se? – Earlz

+1

Tendrás que preguntarle a Chuck Moore. Nadie más sabrá la respuesta. [Aquí dice cuando presentó "El postfix condicional criticado alguna vez"] (http://www.colorforth.com/HOPL.html). –

+0

Si no estoy muy equivocado, hay (o, tal vez, hubo) implementaciones (no puedo recordar cuál en este momento, lo siento) donde ENDIF se definió como una especie de sinónimo de ENTONCES, lo que significa que usted no es el primero para encontrar la secuencia de 'IF-ELSE-THEN' un poco demasiado inusual. Yo, nunca he tenido un problema con eso, sin embargo. (Creo que vi una explicación para esto en algún libro hace mucho tiempo, y estaba en la línea de @AshleyF ha dicho en su respuesta.) –

Respuesta

6

Sólo piensa en él como "IF ese es el caso, hacer esto, ELSE hacer eso ... y THEN continuar con ..."

O mejor aún, citas de uso (como en Factor, RetroForth, ...) en cuyo caso es completamente postfix sin palabras especiales en tiempo de compilación; solo palabras regulares que toman direcciones de la pila: [ do this ] [ do that ] if o [ do this ] when o [ do that ] unless. Yo personalmente prefiero esto

Aparte Re: citas

Aquí es how quotations are compiled in RetroForth. En my own Forth (que se compila en mi propia VM), simplemente agregué una instrucción QUOTE que empuja la siguiente dirección a la pila y salta sobre n-bytes. Se espera que los n-bytes finalicen mediante una instrucción RETURN y las palabras if, when, unless consumen un predicado junto con la (s) dirección (es) que dejan las citas anteriores; llamando según corresponda Muy simple de hecho, y las citas generalmente abren la puerta para all kinds of beautiful abstractions away from thinking about the stack.

+0

¡Nunca escuché citas! Sin embargo, parece un excelente mecanismo de abstracción. Cuando inicié este proyecto me preguntaba si era posible tener funciones anónimas en Forth – Earlz

+1

Esto puede o no aplicarse a esta situación, pero la parte 1 de "La alegría de las lenguas concatenadas" ([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), [Parte 3] (http://www.codecommit.com/blog/cat/the-joy-of-concatenative-languages-part-3)) states: " Los condicionales también se ven bastante extraños a primera vista, pero bajo la superficie son profundamente elegantes ... " –

+0

Tengo un problema con esto después de pensarlo un poco más. ¿Cómo implementaría algo como '1 [10] [20] if .' La salida esperada debería ser' 10' .. Pero, hace que la pila se salga de línea y cuando la cita "vuelva", vuelve a '10 'o' 20' que no es correcto. ¿O debería simplemente implementarse con una pila de llamadas secundaria "oculta" para tales retornos internos? – Earlz

Cuestiones relacionadas