he aplicado mi propia Lisp en la parte superior de Node.js, puedo correr s-expresiones como ésta:¿Cómo implementar un sistema macro Lisp?
(assert (= 3 (+ 1 2))) (def even? (fn [n] (= 0 (bit-and n 1)))) (assert (even? 4)) (assert (= false (even? 5)))
Ahora me gustaría añadir macros - la función defmacro
- pero esto es donde yo' estoy atascado. Me pregunto cómo se implementan los macro sistemas en otros Lisps pero no pude encontrar muchos punteros (aparte de this y this).
He visto el sistema macro de Clojure, el Lisp con el que estoy más familiarizado, pero parecía demasiado complicado y no pude encontrar pistas adicionales que pueda aplicar fácilmente (las macros Clojure finalmente compilan en código de bytes que no se aplica a Javascript, tampoco pude entender la función macroexpand1
)
Así que mi pregunta es: dada una implementación de Lisp sin macros pero con AST, ¿cómo se agrega un macroistema como macro de Clojure? ¿sistema? ¿Se puede implementar este macro sistema en Lisp, o requiere características adicionales en la implementación en el lenguaje de host?
Una observación adicional: no he implementado quote
('
) todavía porque no pude averiguar qué tipo de valores deberían estar en la lista devuelta. ¿Debería contener elementos AST u objetos como Symbol
y Keyword
(siendo este último el caso de Clojure)?
Gracias por la respuesta, puedo resumir su respuesta de la siguiente manera: Para 'defun': 1) evaluar AST (devuelve javascript' function' objetos) 2) ejecutar las funciones javascripts 3) pasar los valores resultantes como argumentos a la función lisp. Esto es lo que ya estoy haciendo. Para 'defmacro': 1) idem 2) omitir 3) pasar las funciones de javascript como argumentos a la macro. El resultado que devuelve 'debe ser entonces AST elementos que deben ser evaluados y ejecutados. Esto deja una pregunta sin respuesta: ¿qué debe devolver 'quote'? ¿Debería ser una lista de elementos AST o funciones de JavaScript y otros objs? –
(cita ...) devuelve una lista de "cosas", donde "cosas" está en una forma que puede ser evaluada posteriormente. La belleza de lisp es que su representación de lista es la misma que la representación de AST, por lo que devolver una lista o un AST es equivalente. – dsm
Que una macro no evalúe sus argumentos parece ser un efecto secundario de su naturaleza, en lugar de su propiedad principal de definición, para mí. – Svante