使用宏使用关键字参数调用julia函数

时间:2018-10-04 08:05:09

标签: julia metaprogramming

我正在尝试编写一个宏,该宏调用带有关键字参数的函数(用于JuMP NLexpressions和映射。此函数仅是用于访问数据库的函数。因此它们不代表数学运算)。

最小示例:

function foo1(; int::a=1)
    a
end

function foo2(; int::a=1, int::b=2)
    b
end

macro callfunc(f, keywordargs)
    #function should be called here using symbol
    #return values of f should be returned by macro callfunc
    ex= :($(that)(;$(keywordargs)...)) #this syntax is not correct for sure
    return eval(ex) 
end

@callfunc(foo1, (a=1))
#should return 1

@callfunc(foo2, (a=1, b=2))
#should return 2

希望您能理解我的想法,非常感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

我不清楚为什么您需要一个宏,但是无论如何。

  1. Julia语法

    function foo1(; int::a=1)
        a
    end
    

    function foo1(; a::Int=1)
        a
    end
    
  2. 不要从宏调用eval,宏将表达式作为输入并应返回一个表达式。

  3. 需要esc进行用户输入,请参见https://docs.julialang.org/en/v1/manual/metaprogramming/#Hygiene-1

这是一个原型实现:

macro callfunc(f, kwargs...)
    x = [esc(a) for a in kwargs]
    return :($(f)(; $(x...)))
end

带有示例用法:

julia> foo1(; a::Int = 1) = a;

julia> foo2(; a::Int = 1, b::Int = 2) = b;

julia> @callfunc foo1 a = 5
5

julia> @callfunc foo2 a = 5 b = 6
6

答案 1 :(得分:0)

对于Julia的较低版本,可以通过以下方式解决:

macro NL(f, kwargs...)
    #julia 1.0 code:
    # x = [esc(a) for a in kwargs]
    # return :($(f)(; $(x...)))

    #for julia 0.6.x this needs to be a dict (symbol => value)
    x_dict = Dict(a.args[1] => a.args[2] for a in kwargs)
    #todo: add escaping!
    return :($(f)(; $(x_dict...)))
end

注意:到目前为止,我还无法添加转义...