2010-05-20 10 views
24

¿Cuál es exactamente la definición de "forma Lisp"?Definición de "forma lisp"?

Hasta donde yo sé, es "un átomo o una lista que tiene un símbolo como primer elemento".

Pero entonces, esto (en el esquema) no sería una forma:

((lambda() 42)) ;; The answer to Life, the Universe and Everything. 

Debido a que el primer elemento de la lista es en sí otra lista. Y después de su evaluación, será un procedimiento (no un símbolo).

Puedo encontrar varios sitios web y tutoriales diferentes sobre los formularios Lisp, pero ninguno que proporcione una definición completa y detallada. ¿Dónde puedo encontrar uno?

+4

Eso es en realidad un formulario y un programa de ceceo válido. Supongo que mi definición a continuación será tan detallada como la obtienes, no estoy seguro si olvidé algo, pero creo que es exhaustiva. – Zorf

Respuesta

42

Una forma Lisp es un dato Lisp que es también un programa, es decir, que puede ser evaluada sin un error.

(3 4 1) 

es un dato Lisp, que es una lista de 3, 4 y 1. Esto no es una forma sin embargo, como se trata de evaluar que no da lugar a otro dato. Pero en lugar de un error.

3 

Es un dato y una forma, también llamada 'forma normal' o un "dato de autoevaluación", se evalúa a sí mismo.

(+ 3 4 1) 

es una forma compuesto, evaluando el resultado es en la forma normal de 8.

Aparte de formas y formas compuestas normal, formas compuestas se puede subdividir en llamadas de procedimiento y formas especiales (también llamada sintaxis) pero más adecuadamente, la cabeza de una forma especial es la sintaxis, como en:

(if (oddp 2) (print "me") (print "or me")) 

Ésta es una forma especial porque es la cabeza es la sintaxis, y no un procedimiento, el única diferencia entre las llamadas a procedimientos y formas especiales es que las llamadas a procedimientos ver todos los argumentos de la forma como las formas en sí mismo y tratar de evalúelo primero y las formas especiales no necesariamente hacen eso. Según entendemos, solo el segundo y cuarto miembro de esta forma compuesta se evalúan, el primer miembro es la sintaxis y el tercero se descarta en este caso. Como sabemos por ejemplo:

((a 1) (b 2)) 

no es una forma en Common Lisp, que podría ser una forma válida en el esquema, pero sólo si la forma (a 1) evalúa a un dato procedimiento.Por lo tanto:

(let ((a 1) (b 2)) (+ a b)) 

es una forma especial , no evalúa su segundo miembro, y evalúa su tercer miembro de una manera diferente a lo que se esperaría si no fuera una forma especial. Es decir, a y b como subformularios de su tercera forma tienen una unión diferente. let en este caso es una palabra clave sintáctica que señala la forma especial.

Tenga en cuenta que es muy posible que las formas especiales todavía evalúen todos sus argumentos, todavía no son llamadas de procedimiento, porque su encabezado es sintaxis y los procedimientos pueden pasarse a otras funciones como argumentos, la sintaxis no puede, así:

(func arg1 #'let) 

es un error, del mismo modo:

(funcall let ((a 1) (b 2)) (+ a b)) 

es un error, lo que demuestra que es diferente a una llamada de procedimiento.

+1

Excelente respuesta – batman

+0

¿Cómo declararía su propio formulario 'if', podría publicar un ejemplo de la sintaxis de un formulario' my-if'? – eliocs

+0

Me temo que 'lisp datum' no es una redacción correcta, ya que el dato en Lisp se define como 'Una lista es una lista de pares, el auto de un par se llama clave, y el cdr se llama datum' de p431 Common Lisp 2nd edition. – prosseek

13

Desde el common lisp hyperspec glossary

forma n. 1. cualquier objeto destinado a ser evaluado. 2. un símbolo, una forma compuesta o un objeto de autoevaluación. 3. (para un operador, como en <<operator>> form'') a compound form having that operator as its first element. Un formulario de cotización es una forma constante. ''