Domanda

È eventuali analogie per lo schema define-syntax in Elip? In define-syntax posso specificare alcune parole chiave e in Elisp defmacro sembra che non posso. Modifica: sembra che non ti capisca bene, o la mia domanda non è chiara. In combinazione è possibile definire macro con parole riservate come

.

(Loop for A in Alcuni elenchi

(Loop while ...

In Emacs Lisp non ho trovato il modo di presentare tale zucchero. Al massimo, posso fare per la macro, che deve essere chiamato come

(loop-per un elenco (fai-un sacco di cose ...)

Leggibilità materiali

È stato utile?

Soluzione

Sia lo schema che l'Erisco hanno sistemi macro. Le "parole chiave" define-syntax e defmacro Introducono entrambi un nome per una macro definita dall'utente.

Al momento una macro, foo, viene utilizzata nel codice reale, dire (foo 1 bar) L'espansore macro deve determinare come riscrivere il modulo specificato, (foo 1 bar), in un modulo più semplice che non contiene macro utente. L'Expander macro chiama la funzione che è stata definita al momento in cui è stato definito il macro foo. Cioè Chiama la funzione specificata con define-syntax o defmacro con una rappresentazione del modulo, (foo 1 bar). La rappresentazione può essere come "oggetti sintassi" o liste semplici (questo differisce in diversi sistemi macro).

Questa è la mia presa sulle somiglianze tra define-syntax e defmacro.

I sistemi macro dello schema R5RS ed ELIP sono diversi però.

L'espansore macro associato a foo può essere specificato nello schema R5RS con l'aiuto di syntax-rules. Ciò consente di utilizzare la corrispondenza del modello per specificare le regole di riscrittura (internamente il modulo delle regole di sintassi valuterà per funzionare). Altre differenze: l'algoritmo di espansione macro nello schema R5RS ti aiuta a introdurre inavvertitamente i nomi si scontrano con nomi da altre parti del tuo programma (dicono da una libreria, non hai scritto te stesso). Storicamente A causa del modo in cui i namespaces lavorano a Lisp, questo problema non è un grande affare a Lisp, ma è possibile commettere errori.

Storicamente schema ed Elip ha utilizzato lo stesso algoritmo di espansione macro, ma poi gli schemi hanno iniziato a sperimentare con altri algoritmi. I sistemi "Syntax-Regole" sono stati introdotti in R5RS, ma l'evoluzione non si fermò lì. In questi giorni tutti i moderni implementazione del sistema hanno (varianti di) sistema "sintassi-custodia".

Alcune implementazione hanno svolto il lavoro per rendere questo algoritmo di espansione lavori con moduli (racchetta, implementazioni R6RS e altri).

In breve, quando leggi sui sistemi macro dello schema, prenditi cura di esaminare con precisione quale variante stai leggendo. Se stai leggendo le restrizioni, molto probabilmente hai trovato un testo sul sistema (ora piuttosto vecchio) syntax-rules.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top