Les macros peuvent créer des fonctions dans la portée globale. Par exemple:Fonctions prédéfinies générées automatiquement avec les macros Common Lisp
(defmacro test-macro (&body functions)
`(progn ,@(loop for function in functions
collect `(defun ,function()
*some-interesting-thing*))))
Un autre exemple (quoique avec des méthodes) serait les accesseurs générés automatiquement pour une classe CLOS.
Les fonctions ne sont pas définies au moment de l'expansion de la macro, mais plutôt lorsque le code généré est compilé/interprété. Cela peut causer quelques difficultés. Si ces fonctions sont attendues, un avertissement sera émis. Quelle est la manière idiomatique de définir ces fonctions avant qu'elles ne soient correctement définies? Une solution possible pourrait être la suivante:
(defmacro test-macro (&body functions)
(macrolet ((empty-function (name)
`(defun ,name())))
(dolist (function functions)
(empty-function function)))
`(progn ,@(loop for function in functions
collect `(defun ,function()
*some-interesting-thing*))))
Notez que la fonction intermédiaire est définie au cours du temps d'expansion macro.
Le problème que vous décrivez (tel que je le comprends) ne devrait pas exister (selon la spécification) et n'existe pas (dans toute application que je connais). Pourriez-vous s'il vous plaît fournir des exemples de code explicites? – sds