Як визначається змінна оцінка масштабів макросів?


11

Візьмемо наступний приклад макросу, визначеного в macro.el.

(defmacro some-macro (&rest body)
  `(let ((some-variable 1))
     ,@body))

І візьміть наступну функцію, певну в іншому файлі , function.el.

(defun some-function ()
  (some-macro (do-something)))

Коли function.elбайт складений, буде some-variableпов'язаний під лексичним чи динамічним зв'язуванням?

Я розумію, це залежить від того, чи використовується файл -*- lexical-binding: t; -*-, тому моє запитання стосується конкретних ситуацій:

  1. Якщо function.elвикористовується лексичне зв’язування, але macro.elце не так.
  2. Якщо macro.elвикористовується лексичне зв’язування, але function.elце не так.

Чи має значення це, якщо some-varвін був оголошений глобальним (з дефваром) всередині function.el? Якщо це так, мене спеціально цікавить випадок, коли цього не сталося .


Я думаю, що Jisang Yoo детально висвітлював це на yoo2080.wordpress.com/2013/08/14/…
phils

Я точно не знаю, але я б обміняв, що розширення макросу успадковує семантику прив’язки із сайту розширення, а не з визначення макросу. Це має сенс, оскільки розширення насправді замінено на сайті виклику. Але: Чому ти хочеш це знати? Ви маєте намір написати код, який насправді спирається на ці деталі ?!
місячник

@lunaryorn макрос цілком не покладається на це, але він може створювати користувачі дивовижні помилки, якщо він не поважає прив’язку файлу, в якому він використовується.
Malabarba

@Malabarba Запишіть свій макрос таким чином, що не покладається на прив'язку в цільовому буфері. Або ще краще, взагалі не використовуйте макрос.
місячник

@lunaryorn Мені було не зовсім зрозуміло. Макрос - це лише форма пускання, і він працює так, як рекламується в будь-якому випадку. Я просто хочу переконатися, що ця форма дозволу відповідає розміщенню, вказаному у розширеному файлі. Це питання є частиною з'ясування того, чи відбувається це автоматично, чи потрібно мені кодувати це в макросі.
Малабарба

Відповіді:


9

Видом масштабування, активним для (let ((some-variable ..)) ...)вашого прикладу, є той, який активний на сайті макровиклику (тобто той, який стосується some-function).

Макрос може знати, який тип масштабування буде використаний для коду, який він повертає, перевіривши значення lexical-bindingзмінної.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.