Quali sono le tipiche applicazioni delle macro Lisp?

19

Sto cercando di imparare un po 'di LISP e ho letto molto sull'importanza delle macro LISP, quindi mi piacerebbe avere qualche esperienza lavorativa con loro.

Puoi suggerire un'area di applicazione pratica che mi consenta di utilizzare macro per risolvere un problema del mondo reale e di comprendere l'utilità di questo costrutto di programmazione?

Nota

Questa non è una domanda generica quale progetto dovrei fare dopo . Sono interessato a capire quali tipi di problemi vengono in genere risolti mediante macro LISP. Ad esempio, sono utili per implementare tipi di dati astratti? Perché questo costrutto è stato aggiunto alla lingua? Quali tipi di problemi risolve che non possono essere risolti con semplici funzioni?

    
posta Giorgio 03.07.2012 - 22:06
fonte

2 risposte

9

Le macro Lisp combinano alcune proprietà distinte:

  1. Le macro definiscono la nuova sintassi e leftrightarrow; usano il codice sorgente come input
  2. I macro di solito vengono eseguiti in fase di compilazione
  3. Macro genera codice sorgente

Le migliori applicazioni fanno uso di tutti questi aspetti. Probabilmente l'esempio più noto è (loop ...) in Common Lisp, non sarebbe da nessuna parte vicino alla sua utilità senza una di quelle funzionalità. Senza la sorgente come input sarebbe scomodo definire le azioni all'interno del ciclo; senza un'espansione in fase di compilazione sarebbe troppo lento; e senza generare codice non sarebbe eseguibile.

Un altro buon esempio è il capitolo sulla serializzazione binaria in Comodo comune Lisp , Pratico: analisi dei file binari .

Una macro di query che implementa qualcosa di simile a LINQ potrebbe essere un'altra buona applicazione. Ma mancherebbe il completamento automatico che rende LINQ bello come è. Quasi tutto ciò che oggi è risolto da generatori di codice di scopo speciale con input XML (ad esempio XAML) potrebbe anche essere implementato utilizzando macro Lisp.

    
risposta data 04.07.2012 - 00:23
fonte
2

Il modo in cui mi piace pensare alle macro in comune lisp è che sono funzioni che restituiscono il codice da valutare, ma "non" valutano i loro argomenti prima di restituire quel codice. Le funzioni restituiscono anche qualcosa, ma valutano ogni argomento prima che il loro corpo venga valutato. Le macro no.

Paul Graham in 'On Lisp' fornisce (IMHO) una delle migliori descrizioni delle differenze tra macro e funzioni e discute la loro sovrapposizione e unicità. Molti bit di codice possono essere scritti come una funzione o una macro, ma ci sono casi in cui funziona solo una macro. Una volta che ti avvolgi nella tua mente, penso che tu abbia il succo delle macro in lisp.

Come esempio di una macro in cui una funzione non funzionerà, controlla 'aif' (anaphoric if). Sono solo alcune righe di codice e la mia raccomandazione su dove iniziare.

E fai riferimento alla versione di Anaphoric del Common Lisp se, che sfrutta l'acquisizione di variabili intenzionali. La versione automaticamente igienica del regime non è IMO il "vero affare". La cattura variabile è una parte importante della macrologia di Lisp e alcuni dei più potenti e utili macro ne approfittano sicuramente.

    
risposta data 05.07.2012 - 03:26
fonte

Leggi altre domande sui tag