如何改变泛型函数中的表达式?

时间:2014-02-06 08:54:14

标签: julia

E.g。

function sq(x)
    x ^ 2
end

function sq2(x)
    (x+1) ^ 2
end

function fun(x)
    sq(x)
end

我想用sq调用替换sq2调用,以便重新定义fun泛型函数。 我下面的尝试更改了呼叫,但无法重新定义该功能。任何帮助将不胜感激。

change(:fun, (Int,))

function analyze_expr(exp::Expr)
   for i = 1:length(exp.args)
      arg = exp.args[i]
      if(typeof(arg) == Expr)
         analyze_expr(arg)
      elseif(arg==symbol("sq"))
         exp.args[i] = symbol("sq2")
      end
   end

function change(sym::Symbol, params)
    func = eval(sym)
    func_code = code_lowered(func, params)
    func_body = func_code[1].args[3]
    analyze_expr(func_body)
    println("Printing function body:",func_body)
end

1 个答案:

答案 0 :(得分:1)

我怀疑你会发现使用宏做这种工作更容易:http://docs.julialang.org/en/latest/manual/metaprogramming/

鉴于现有的函数定义,Julia中的相关内容并不是生成它的语法,而是生成的编译机器代码。据我所知,修改语法不会(在Julia的内部没有深入的黑客攻击)对编译的机器代码有任何影响。