如何确定宏的变量作用域?


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在内部声明了全局变量(使用defvar),会有所不同function.el吗?如果是这样,我在那里的情况特别感兴趣也没有


我认为Jisang柳在一些细节包括在本yoo2080.wordpress.com/2013/08/14/...
菲尔斯

我不确定,但是我敢打赌,宏扩展从扩展站点继承绑定语义,而不是从宏定义继承。这是有道理的,因为扩展实际上是在呼叫站点被替换的。但是:为什么要知道?您打算编写实际上依赖这些细节的代码吗?
lunaryorn 2014年

@lunaryorn 宏观不完全依靠这一点,但它可能会产生奇怪的错误给用户,如果它不尊重它在使用的文件的结合。
Malabarba

@Malabarba然后以不依赖目标缓冲区中绑定的方式编写宏。甚至更好的是,根本不使用宏。
lunaryorn 2014年

@lunaryorn我不太清楚。宏只是一个让形式,它可以按照任何一种方式进行宣传。我只想确保此let表单遵循扩展文件中指定的范围。此问题是确定是否自动发生或是否需要在宏中进行编码的一部分。
马拉巴巴

Answers:


9

(let ((some-variable ..)) ...)在您的示例中,作用域范围有效的一种是宏调用现场的作用域范围(即适用于的范围some-function)。

宏可以通过检查lexical-binding变量的值来知道返回的代码将使用哪种范围。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.