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.
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