Quelles sont les applications typiques des macros Lisp?

19

J'essaie d'apprendre un LISP et j'ai beaucoup lu sur l'importance des macros LISP, donc je voudrais acquérir une certaine expérience de travail avec elles.

Pouvez-vous suggérer un domaine d'application pratique qui me permettrait d'utiliser des macros pour résoudre un problème du monde réel et comprendre l'utilité de cette construction de programmation?

REMARQUE

Ce n'est pas un projet générique que dois-je faire la prochaine question. Je suis intéressé à comprendre quels types de problèmes sont généralement résolus au moyen de macros LISP. Par exemple, sont-ils bons pour implémenter des types de données abstraits? Pourquoi cette construction a-t-elle été ajoutée au langage? Quels types de problèmes résout-il qui ne peuvent pas être résolus au moyen de fonctions simples?

Giorgio
la source

Réponses:

9

Les macros Lisp combinent quelques propriétés distinctes:

  1. Les macros définissent une nouvelle syntaxe ↔ elles utilisent le code source comme entrée
  2. Les macros sont généralement exécutées au moment de la compilation
  3. Les macros génèrent du code source

Les meilleures applications utilisent tous ces aspects. L'exemple le plus connu est probablement la (boucle…) en Common Lisp, il ne serait pas proche de son utilité sans l'une de ces fonctionnalités. Sans la source comme entrée, il serait difficile de définir les actions à l'intérieur de la boucle; sans expansion au moment de la compilation, ce serait beaucoup trop lent; et sans génération de code, il ne serait pas exécutable.

Un autre bel exemple est le chapitre sur la sérialisation binaire dans Practical Common Lisp , Practical: Parsing Binary Files .

Une macro de requête qui implémente quelque chose de similaire à LINQ pourrait être une autre bonne application. Mais il manquerait l'auto-complétion qui rend LINQ aussi agréable qu'il est. Presque tout ce qui est aujourd'hui résolu par des générateurs de code à usage spécial avec des entrées XML (par exemple XAML) pourrait également être implémenté à l'aide de macros Lisp.

Patrick
la source
Je viens d'acheter le livre "Practical Common Lisp", je vais jeter un œil à l'exemple que vous proposez.
Giorgio
2

La façon dont j'aime penser les macros dans le lisp commun est que ce sont des fonctions qui renvoient du code à évaluer, mais «n'évaluent pas» leurs arguments avant de retourner ce code. Les fonctions renvoient aussi quelque chose, mais elles évaluent chaque argument avant d'évaluer leur corps. Les macros ne le font pas.

Paul Graham dans «On Lisp» fournit (à mon humble avis) l'une des meilleures descriptions des différences entre les macros et les fonctions, et discute de leur chevauchement et de leur unicité. De nombreux bits de code peuvent être écrits sous forme de fonction ou de macro, mais il existe des cas où seule une macro fonctionnera. Une fois que vous avez tourné la tête autour de cela, je pense que vous avez l'essentiel des macros dans lisp.

Comme exemple d'une macro où une fonction ne fonctionnera pas, consultez 'aif' (si anaphorique). Ce ne sont que quelques lignes de code, et ma recommandation sur où commencer.

Et faites référence à la version Common Lisp de si anaphorique, qui tire parti de la capture intentionnelle de variables. La version automatiquement hygiénique de Scheme n'est pas IMO la «vraie affaire». La capture de variables est un élément important de la macrologie lisp, et certaines des macros les plus puissantes et utiles en tirent certainement parti.

Clayton Stanley
la source