Prenez l'exemple de macro suivant, défini dans macro.el
.
(defmacro some-macro (&rest body)
`(let ((some-variable 1))
,@body))
Et prendre la fonction suivante, définie dans un autre fichier , function.el
.
(defun some-function ()
(some-macro (do-something)))
Quand function.el
est compilé en octets, sera-t- some-variable
il lié sous une liaison lexicale ou dynamique?
Je comprends que cela dépend de l'utilisation du fichier -*- lexical-binding: t; -*-
, donc ma question concerne spécifiquement les situations suivantes:
- Si
function.el
utilise une liaison lexicale, maismacro.el
pas. - Si
macro.el
utilise une liaison lexicale, maisfunction.el
pas.
Cela fait-il une différence s'il some-var
a été déclaré global (avec un defvar) à l'intérieur function.el
? Si c'est le cas, je suis particulièrement intéressé par le cas où ce n'est pas le cas .
elisp
elisp-macros
lexical-scoping
Malabarba
la source
la source
Réponses:
Le type de portée actif pour le
(let ((some-variable ..)) ...)
dans votre exemple est celui qui est actif sur le site de l'appel de macro (c'est-à-dire celui qui s'appliquesome-function
).Une macro peut savoir quel type de portée sera utilisé pour le code qu'elle renvoie en vérifiant la valeur de la
lexical-binding
variable.la source