Weźmy następujące makro przykładowe, zdefiniowane w macro.el
.
(defmacro some-macro (&rest body)
`(let ((some-variable 1))
,@body))
I przyjąć następującą funkcję zdefiniowaną w innym pliku , function.el
.
(defun some-function ()
(some-macro (do-something)))
Kiedy function.el
zostanie skompilowany bajtowo, zostanie some-variable
powiązany w powiązaniu leksykalnym lub dynamicznym?
Rozumiem, że zależy to od tego, czy plik używa -*- lexical-binding: t; -*-
, więc moje pytanie dotyczy w szczególności następujących sytuacji:
- Jeśli
function.el
używa powiązania leksykalnego, alemacro.el
nie używa . - Jeśli
macro.el
używa powiązania leksykalnego, alefunction.el
nie używa .
Czy robi to różnicę, jeśli some-var
został zadeklarowany jako globalny (z defvarsem) w środku function.el
? Jeśli tak, jestem szczególnie zainteresowany przypadkiem, w którym tak się nie stało .
elisp
elisp-macros
lexical-scoping
Malabarba
źródło
źródło
Odpowiedzi:
Rodzaj scopingu aktywny
(let ((some-variable ..)) ...)
w twoim przykładzie jest taki, który jest aktywny w miejscu wywołania makra (tj. Ten, który dotyczysome-function
).Makro może wiedzieć, jaki rodzaj zakresu zostanie użyty dla kodu, który zwraca, sprawdzając wartość
lexical-binding
zmiennej.źródło