Envolviendo mi mente alrededor de la notación de prefijo?

10

Estoy leyendo sobre LISP.

Entiendo cómo funciona la notación de prefijos en cierto nivel, pero me preguntaba si hay algún truco para hacerlo intuitivo.

Galletas De Harina De Arroz
fuente
66
Además de la práctica, ¿quieres decir?
El usuario RPL es, con mucho, mi sabor favorito de LISP. ¡Ni siquiera tiene paréntesis! en.wikipedia.org/wiki/RPL_(programming_language) Extraño usar mi HP 50g :-(
Robbie
Al principio parecía poco intuitivo, pero ahora creo que es maravilloso, y casi siempre he leído. En realidad es cómo hablamos: "La suma de ..., el producto de ..." Sin embargo, requiere un tipo diferente de lectura. Ahora simplemente aplica el operador a todos los argumentos, en lugar de leerlos en una línea.
Mark C
¿Qué hay de malo con la notación de prefijo? Casi todos los idiomas lo están usando. Las llamadas a funciones casi siempre son prefijos.
SK-logic
Realmente no; "intuitivo" es intuitivo porque lo has aprendido en forma de convenciones matemáticas durante más de 20 años. Dado que solo LISP y tal vez algunos otros idiomas usan esta convención, y aún aprenderá el otro mucho más, casi nunca será igualmente "intuitivo". Y estamos hablando solo de expresiones simples aquí (2 + 3 ... ¿cómo le gustaría probar una línea de "media página"? :)
Rook

Respuestas:

6

Leerlo mentalmente de izquierda a derecha como lenguaje hablado con los verbos adecuados puede ayudar. Por ejemplo (+ 3 2) podría ser "agregar tres y dos". En el caso más general, puede decir "realizar $ operación en $ operandos". Aplicado al mismo caso: "Realizar la operación de agregar en tres y dos".

Joris Timmermans
fuente
¿Qué harías con ( = 1 2 )y?( > 4 2 )
Rice Flour Cookies
3
Usarías preguntas retóricas. :) Igual? (¿Qué?), "1 y 2! (Erm ... No ...)
Arafangion
@RiceFlour (Oye, crecí comiendo cosas hechas con harina de arroz, tengo un problema de gluten). Leía "¿Es uno igual a dos?" O "¿Son iguales los siguientes?" Los operadores mayor que y menor que no son tan naturales en forma de prefijo, pero me pregunto con qué frecuencia se usan en el código Lisp.
Mark C
7

¿Trucos? ¿Para qué?

Todavía no te parece intuitivo porque tu analizador mental no está acostumbrado. Mejorará si lo usa y lo lee una y otra vez.

Halcón
fuente
Ni siquiera he leído que gran parte de ella, pero ahora creo que es maravilloso. Parece que mi cerebro está comenzando a tener un sentido casi "táctil" sobre los paréntesis. Creo que el sentimiento solo se volverá más agudo.
Mark C
5

Podrías pensarlo como una especie de llamada de función:

(operator operand1 operand2 ...)

No hay nada muy especial al respecto. Si sobrecarga los operadores en C ++ (y muchos otros lenguajes que lo permiten), a menudo tiene que definir este tipo de función exactamente de esa manera:

MyClass operator+(MyClass const& x, MyClass const& y);
Thorsten Müller
fuente
Sí, así es como lo hago. Si retrocede y mira las llamadas a métodos en Java, C #, etc., en realidad son solo una notación de prefijo con paréntesis en un lugar ligeramente diferente: MyMethod (arg1, arg2).
nlawalker
4

Muchos idiomas usan una combinación de prefijo, infijo e incluso postfix.

Lisp solo usa el prefijo, por defecto. Si sin (x) es intuitivo de las matemáticas, entonces (sin x) no está muy lejos. Si mover (perro, hogar) es una llamada de procedimiento tradicional, entonces en Lisp es solo (mover perro a casa).

Lisp no hace ninguna excepción para las matemáticas y trata +, -, * y otros como las llamadas a funciones ordinarias.

Rainer Joswig
fuente
2

Cuando (eventualmente) "Todo es una llamada a función" (o una forma especial, o una macroexpansión, ambas con la sintaxis superficial de "llamada a función") hace clic, se siente bastante natural.

Entonces, porque (= 1 2)lo leí como 'llamar a la comparación numérica igual a 1 y 2'.

Vatine
fuente