我正在尝试编写一个宏,该宏调用带有关键字参数的函数(用于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
希望您能理解我的想法,非常感谢您的帮助!
答案 0 :(得分:2)
我不清楚为什么您需要一个宏,但是无论如何。
Julia语法
function foo1(; int::a=1)
a
end
是
function foo1(; a::Int=1)
a
end
不要从宏调用eval
,宏将表达式作为输入并应返回一个表达式。
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
注意:到目前为止,我还无法添加转义...