Quali sono le applicazioni tipiche delle macro Lisp?


19

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

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

NOTA

Questo non è un generico quale progetto dovrei fare alla prossima domanda. Sono interessato a capire quali tipi di problemi vengono in genere risolti mediante le macro LISP. Ad esempio, sono utili per l'implementazione di tipi di dati astratti? Perché questo costrutto è stato aggiunto alla lingua? Che tipo di problemi risolve che non possono essere risolti mediante semplici funzioni?


Risposte:


9

Le macro Lisp combinano alcune proprietà distinte:

  1. Le macro definiscono una nuova sintassi ↔ usano come input il codice sorgente
  2. Le macro di solito vengono eseguite in fase di compilazione
  3. Le macro generano il codice sorgente

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

Un altro ottimo esempio è il capitolo della serializzazione binaria in Practical Common Lisp , Practical: Parsing Binary Files .

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 lo è. Quasi tutto ciò che oggi viene risolto da generatori di codice per scopi speciali con input XML (ad esempio XAML) potrebbe anche essere implementato utilizzando macro Lisp.


Ho appena comprato il libro "Practical Common Lisp", darò un'occhiata all'esempio che hai suggerito.
Giorgio,

2

Il modo in cui mi piace pensare alle macro in lisp comune è che sono funzioni che restituiscono il codice da valutare, ma "non" valutano i loro argomenti prima di restituire quel codice. Anche le funzioni restituiscono 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 della 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 ci si avvolge la testa, penso che tu abbia l'essenza di macro in lisp.

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

E fai riferimento alla versione anaforica di Common Lisp if, che sfrutta la cattura intenzionale delle variabili. La versione automaticamente igienica dello schema non è l'IMO il "vero affare". L'acquisizione variabile è una parte importante della macrologia lisp e alcune delle macro più potenti e utili ne traggono sicuramente vantaggio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.