Macros Julia中的宏调用与宏定义环境

Macros Julia中的宏调用与宏定义环境,macros,julia,hygiene,Macros,Julia,Hygiene,我试图理解Julia关于的元编程文档中的一句话。文件声称: Julia的宏扩展器通过以下方式解决了这些问题。首先,宏结果中的变量分为局部变量和全局变量。如果变量被赋值(而不是声明为全局)、声明为局部或用作函数参数名,则该变量被视为局部变量。否则,它被认为是全球性的。然后将局部变量重命名为唯一变量(使用gensym()函数生成新符号),并在宏定义环境中解析全局变量。因此,上述两个问题都得到了处理;宏的局部变量不会与任何用户变量冲突,时间和println将引用标准库定义 我写了一个小程序,看看全局变

我试图理解Julia关于的元编程文档中的一句话。文件声称:

Julia的宏扩展器通过以下方式解决了这些问题。首先,宏结果中的变量分为局部变量和全局变量。如果变量被赋值(而不是声明为全局)、声明为局部或用作函数参数名,则该变量被视为局部变量。否则,它被认为是全球性的。然后将局部变量重命名为唯一变量(使用gensym()函数生成新符号),并在宏定义环境中解析全局变量。因此,上述两个问题都得到了处理;宏的局部变量不会与任何用户变量冲突,时间和println将引用标准库定义

我写了一个小程序,看看全局变量是否确实在宏定义环境中被解析。我写了以下内容:

f(x) = x + 100 

macro g()         # According to Julia docs, ...
  :(f(x) + 5)     # ... f is global, x is local, right?
end               # if so, f should refer to the f above?

(function main()
  local x = 3
  f(x) = x - 100  # f in the call environment subtracts 100
  println(@g())   # So why does this do -92?
end)()
如果我想正确理解Julia文档,宏卫生的一部分就是确保在宏的返回表达式中调用的函数不会被调用方环境中同名的函数劫持。但这正是这里发生的事情,所使用的函数
f
是本地定义的函数

我本以为我必须使用
esc
,以便在调用点的范围内使用
f
。但事实并非如此,为什么

此外,我注意到宏结果中的变量
x
被认为是局部变量,因此应该为其生成一个新的gensymed变量名,以免与宏调用环境中的
x
冲突。但这也没有发生

我该如何阅读文档才能弄清楚这里不需要使用
esc
的原因

编辑(澄清)
  • 根据文档,当我声明
    f
    是全局的,而
    x
    是局部的时,我这样做是因为我看到
    x
    被用作函数参数。我知道
    x
    既没有被写入也没有声明为本地,它看起来当然是全局的,但是那些文档声称函数参数也应该是全局的

  • 我知道卫生学中的一个常见部分,即本地人的gensymming可以确保宏调用方上下文中相同名称的变量不会被无意中抹去。然而,文档声称,对于函数,在宏定义的上下文中看到的函数使用它们自己的函数来保护它们不受调用方的影响。这一部分对我来说毫无意义,因为我的实验表明并非如此


  • 这是一个错误。这是Julia 0.5及更早版本的老版本,已在Julia 0.6中修复。有关更多信息,请参阅。

    请参阅,这仍然是一个悬而未决的问题?我终于开始安装0.6,是的,现在情况更好了。