Ambil contoh makro berikut, didefinisikan dalam macro.el
.
(defmacro some-macro (&rest body)
`(let ((some-variable 1))
,@body))
Dan mengambil fungsi berikut, didefinisikan dalam file yang berbeda , function.el
.
(defun some-function ()
(some-macro (do-something)))
Kapan function.el
byte-dikompilasi, apakah some-variable
akan terikat di bawah lexical atau dynamic binding?
Saya mengerti ini tergantung pada apakah file digunakan -*- lexical-binding: t; -*-
, jadi pertanyaan saya secara khusus berkaitan dengan situasi berikut:
- Jika
function.el
menggunakan pengikatan leksikal, tetapimacro.el
tidak. - Jika
macro.el
menggunakan pengikatan leksikal, tetapifunction.el
tidak.
Apakah ada bedanya jika some-var
telah dinyatakan global (dengan defvar) di dalamnya function.el
? Jika ya, saya secara khusus tertarik pada kasus di mana tidak .
elisp
elisp-macros
lexical-scoping
Malabarba
sumber
sumber
Jawaban:
Jenis pelingkupan aktif untuk
(let ((some-variable ..)) ...)
dalam contoh Anda, adalah yang aktif di situs panggilan makro (yaitu yang berlaku untuksome-function
).Makro dapat mengetahui jenis pelingkupan mana yang akan digunakan untuk kode yang dikembalikan dengan memeriksa nilai
lexical-binding
variabel.sumber