Ho implementato il mio Lisp in cima node.js, posso correre s-espressioni come questa:Come implementare un sistema macro Lisp?
(assert (= 3 (+ 1 2))) (def even? (fn [n] (= 0 (bit-and n 1)))) (assert (even? 4)) (assert (= false (even? 5)))
Ora vorrei aggiungere macro - la funzione defmacro
- ma questo è dove ho' m bloccato Mi chiedo come i sistemi macro siano implementati in altri Lisps ma non sono riuscito a trovare molti puntatori (a parte lo this e lo this).
Ho esaminato il sistema macro Clojure - il Lisp con cui ho più familiarità - ma mi sembrava troppo complicato e non sono riuscito a trovare ulteriori indizi che posso facilmente applicare (le macro Clojure alla fine compilano il codice byte che non si applica a javascript, inoltre non ho potuto dare un senso alla funzione macroexpand1
.)
Quindi la mia domanda è: data un'implementazione Lisp senza macro ma con un AST, come si aggiunge un sistema macro come la macro di Clojure sistema? Questo sistema macro può essere implementato in Lisp o richiede funzionalità aggiuntive nell'implementazione nella lingua host?
Un'osservazione aggiuntiva: non ho ancora implementato quote
('
) perché non sono riuscito a capire quale tipo di valori dovrebbe essere presente nell'elenco restituito. Dovrebbe contenere elementi AST o oggetti come Symbol
e Keyword
(quest'ultimo è il caso di Clojure)?
Grazie per la risposta, posso riassumere la tua risposta come segue: Per 'defun': 1) valutare AST (restituisce oggetti' javascript 'function') 2) eseguire le funzioni javascripts 3) passare i valori risultanti come argomenti a la funzione lisp. Questo è quello che sto già facendo. Per 'defmacro': 1) idem 2) skip 3) passare le funzioni javascript come argomenti alla macro. Il risultato che viene restituito da 'dovrebbe quindi essere elementi AST che dovrebbero essere valutati ed eseguiti. Questo lascia una domanda senza risposta: cosa dovrebbe restituire "quote"? Dovrebbe essere una lista di elementi AST o funzioni javascript e altri oggetti? –
(quota ...) restituisce una lista di "cose", dove "roba" è in una forma che può essere successivamente valutata. La bellezza di lisp è che la sua rappresentazione di lista è la stessa della rappresentazione AST, quindi restituire una lista o un AST sono equivalenti. – dsm
Che una macro non valuti i suoi argomenti sembra essere un effetto collaterale della sua natura, piuttosto che la sua principale proprietà di definizione, per me. – Svante