2014-02-06 32 views
0

例如如何修改泛型函數中的表達式?

function sq(x) 
    x^2 
end 

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

function fun(x) 
    sq(x) 
end 

我想與sq2調用來替換sq調用,這樣重新定義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

我懷疑你會發現它更容易使用宏做這樣的工作:http://docs.julialang.org/en/latest/manual/metaprogramming/

鑑於現有的功能定義,朱莉婭相關的事情」不是個非常像生成它的編譯機器代碼的語法。據我所知,修改語法不會(在Julia的內部沒有深入黑客)對編譯的機器代碼有任何影響。

+0

謝謝約翰的指針。 – ekobir