function - 使用 args 和关键字 args 对 Julia 函数进行元编程

标签 function metaprogramming julia

我想自动构建许多 Julia 函数(元编程)来包装库。

这是我想要生成的函数:

function myfunc(a::Array{Float64,1}, b::Array{Float64,1}; x=Int64(1), y=Float64(2))
    x + y
end

这里是我想用来生成这样一个函数的函数的参数。

funcname = :my_func
args = (:a, :b)
args_typ = (Array{Float64,1}, Array{Float64,1})
kw_args = (:x, :y)
kw_defval = (1, 2)
kw_typ = (Int64, Float64)

我对 Julia 宏和 http://docs.julialang.org/en/release-0.4/manual/metaprogramming/ 感到不舒服对我帮助不大。

我还希望能够显示函数(生成的)代码。

我的第一个想法(不是很自动化)是

macro GEN_FUNC(funcname)
    function $funcname(a, b, x=1, y=2)
        return x
    end
end

但它提高了

ERROR: syntax: invalid method name "$funcname"

最佳答案

您应该从宏返回一个表达式。要使代码成为表达式,请使用 :(....)quote ... end 修饰代码。此外,$ 仅对表达式和字符串有效。最后,宏还存在卫生问题。为了保持 $funcname 完整,您需要 esc 围绕它。这是更正后的代码

julia> macro GEN_FUNC(funcname)  
           fname=esc(funcname)  
           quote  
               function $fname(a, b, x=1, y=2)  
                   return x  
               end  
           end  
       end  

julia> macroexpand(:(@GEN_FUNC testing))  
quote  # none, line 4:  
    function testing(#21#a,#22#b,#23#x=1,#24#y=2) # none, line 5:  
        return #23#x  
    end  
end

更新:以下是如何手动构造 myfunc (提示:我用 quote ... end 使它成为一个表达式,并从中作弊)

julia> f_body=:(x+y)
:(x + y)

julia> f_parameters=Expr(:parameters, Expr(:kw,:x,Int64(1)), Expr(:kw,:y,Float64(2)))
:($(Expr(:parameters, :(x=1), :(y=2.0))))

julia> f_call=Expr(:call,:myfunc,f_parameters,:(a::Array{Float64,1}),:(b::Array{Float64,1}))
:(myfunc(a::Array{Float64,1},b::Array{Float64,1}; x=1,y=2.0))

julia> f_declare=Expr(:function,f_call,f_body)
:(function myfunc(a::Array{Float64,1},b::Array{Float64,1}; x=1,y=2.0)
        x + y
    end)

julia> eval(f_declare)
myfunc (generic function with 1 method)

julia> myfunc(2,3)
ERROR: MethodError: `myfunc` has no method matching myfunc(::Int64, ::Int64)

julia> myfunc([2.],[3.])
3.0

julia> myfunc([2.],[3.];x=4,y=8.)
12.0

关于function - 使用 args 和关键字 args 对 Julia 函数进行元编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37230071/

相关文章:

c++ - 声明 protected 功能 friend

c++ - 任何元编程方法可以为各种数量的模板参数生成重载?

matrix - 创建新矩阵,所有非零元素都设置为 1 (julia)

julia - 如何在 Julia 中使用绘图创建大括号?

julia - 如何不在 Julia 的内部 block 中隐藏变量?

PHP MySQL : mysqli_free_result

c - 我该如何解决以下代码?

javascript - 为什么我的 php echo 不起作用?

dataframe - Julia 中的动态函数名称定义.. 可能吗?

ruby - 在继承过程中获取匿名类的名称