1

假设我在一个模块中有这个宏定义:

module Example

export @example_macro

macro example_macro(a)
    quote
        local r = RemoteRef()
        put!(r, $(esc(a)))
        remotecall_fetch(2, (r) -> fetch(r), r)
    end
end

end

这是它的扩展:

julia> include("Example.jl")

julia> using Example

julia> macroexpand(quote @example_macro a end)
quote  # none, line 1:
    begin  # /.../Example.jl, line 7:
        local #121#r = Example.RemoteRef() # line 8:
        Example.put!(#121#r,a) # line 9:
        Example.remotecall_fetch(2,(r) -> Example.fetch(r),#121#r)
    end
end

每个全局可用的函数(如put!or fetch)都以模块名称为前缀。我知道这是宏卫生所必需的 - 例如,如果在被调用fetch的模块中重新定义,并按原样插入到扩展中,它将无法正常工作。@example_macrofetch

但是,这也要求Example模块不仅在主进程中可用,而且在第二个工作进程中可用(因为remotecall_fetch需要Example.fetch在其上执行)。我不想要它——毕竟,这fetch是默认情况下所有工作人员都可以使用的基本功能。

那么,有没有办法禁止在所有标识符前面加上当前模块的名称?我认为这意味着使宏变得不卫生,因为无法确定fetch在宏扩展阶段定义某些标识符(如 )的位置,这对我来说很好。

4

1 回答 1

1

由于这是一个非常深刻的问题,我认为您应该让 Julia 开发人员自己有机会通过询问julia-users来回答这个问题。

目前,您可以通过将整个quote块包装在宏中来完全规避宏卫生esc(...)(不要忘记带走escaround a),但我一般建议不要这样做 - 那你就靠自己了。

于 2014-10-05T19:04:11.437 回答