Common Lisp et Macros

Par abaudouinvegas, 10 février, 2024

Qu'est-ce que Common Lisp ? Common Lisp est un langage de programmation dynamique tiré de Lisp. Il offre une flexibilité exceptionnelle grâce à sa gestion avancée des objets et des fonctions, son système de typage dynamique, et son approche de la programmation orientée objet.

Particularité de Common Lisp : Common Lisp se distingue par plusieurs caractéristiques uniques, les macros étant une de ces caractéristiques les plus puissantes. Elles permettent aux développeurs de créer des extensions du langage facilement.

Comment utilise-t-on les macros : Les macros en common lisp sont définis ainsi : 

(defmacro nom_macro (var liste_forme)

    "Description du macro"

    corps_macro)

Référence : https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node97.html

Ce code peut sembler bien simple mais les possibilitées que les macros offrent sont quasiment infinies. Voici quelques exemples pour illustrer ce que je veux dire : 

(defmacro html-list (lst)
 "Génère une liste HTML à partir d'une liste."
 `(progn
    (format t "<ul>~%")
    ,@(loop for item in ,lst

        collect `(format t "<li>~a</li>~%" ,item))
    (format t "</ul>~%")))


Ce macro permet de recevoir une liste et de la transformer en liste html avec les balises appropriées. De plus, il utilise un autre macro existant nommé loop qui permet d'effectuer un formattage sur chaque élément de la liste fournise. Cet exemple utilise 2 nouveaux éléments, soit progn et collect. Progn permet d'éxécuter plusieurs commandes de suite alors que collect permet de collecter des valeurs et les insérer dans une liste.

On utiliserait alors le macro de cette façon : 

(html-list '(item1 item2 item3))

Voici un autre example : 

(defmacro double-elements (lst)
 "Macro qui double chaque élément dans une liste."
 `(mapcar #'(lambda (x) (* ,x 2)) ,lst))
 

Certains me demanderont : "Pourquoi devrais-je utiliser un macro au lieu d'une fonction?" et bien que la différence n'est peut-être pas claire initialement, les macros et les fonctions servent des rôles bien différents.

Les macros sont calculés lors de la compilation ce qui peut les rendre très vites et efficaces alors que les fonctions seront exécutées lorsque le code lui-même est en cours d'exécution. Les macros seront donc utilisés dans des instances où des calculs ou du code ont besoin d'être traités ou générés lors de la compilation, ce qui permet effectivement une extension du langage comme je l'ai mentionné précédemment.

Référence : https://wiki.c2.com/?LispMacro 

Conclusion

Ceci était ma courte exploration de Common Lisp et des Macros. J'espère vous revoir la semaine prochaine afin d'explorer le sujet d'intelligence artificielle et comment Lisp a longtemps dominé ce domaine.

À bientôt !

Étiquettes

Commentaires