Empecé a aprender Common Lisp recientemente, y (solo por diversión) decidí cambiar el nombre de la macro lambda.Renombrando lambda en Common Lisp
Mi intento fue la siguiente:
> (defmacro λ (args &body body) `(lambda ,args ,@body))
Parece expandir correctamente cuando por sí mismo:
> (macroexpand-1 '(λ (x) (* x x)))
(LAMBDA (X) (* X X))
Pero cuando está anidada dentro de una expresión, la ejecución falla:
> ((λ (x) (* x x)) 2)
(Λ (X) (* X X)) is not a function name; try using a symbol instead
Probablemente me esté perdiendo algo obvio sobre la expansión macro, pero no pude descubrir qué es.
¿Quizás me pueda ayudar?
edición: No funciona con lambda:
> ((lambda (x) (* x x)) 2)
4
editar 2: Una forma de hacerlo funcionar (según lo sugerido por Rainer):
> (set-macro-character #\λ (lambda (stream char) (quote lambda)))
(probado en Clozure CL)
No es la 'función' en la expansión de' lambda' que es un problema, es el comportamiento de las aplicaciones con '' lambda'. Entonces, en su explicación, cambiaría: "Una expresión lambda aplicada también es válida" en "Una expresión lambda aplicada" también es válida (solo para 'lambda' y no para macros que se expanden a ella)". –
¡Tiene sentido ahora, gracias! Entonces, ¿no hay forma de obtener (λ ...) para emular una expresión lambda? – ibab
@qrl: la sintaxis ((λ (x) ...) 4) es posible con una macro de lectura en implementaciones de CL que admiten ese carácter. El lector de Lisp tendría que expandir λ a LAMBDA. –