2016-07-12 60 views
3

我想創建一個函數,使用元編程計算方程組的殘差。使用元編程的方程組

這是我已經試過到目前爲止(例如玩具):

function syst!(x::Vector, ou::Vector) 
    for i in 1:length(x) 
     eval(parse("ou[$i] = x[$i]^2 + x[$i]")) 
    end 
    return ou 
end 

然而,當我嘗試計算功能,朱莉婭說,變量x沒有定義。但是如果我包含一個println(parse("ou[$i] = x[$i]^2 + x[$i]")),我會得到在函數體內「鍵入」的代碼(對不起,如果我沒有使用正確的技術CS術語,我來自「科學文化」)。

無論如何,看起來parse ed x住在另一個範圍內。我怎樣才能將解析的x帶到函數的作用域,使它代表syst!參數中的x

獎勵:我有一個700個方程組的系統,他們可以使用元編程進行「輸入」,創建一個計算系統殘差的函數的最佳方法/技巧是什麼?我在正確的軌道上?

+4

它處於預alpha階段,但是一個新的Dolang.jl包旨在做到這一點。主要的API將是'make_method'函數,該函數接受一些Julia表達式,允許的變量,其他函數參數併爲您輸出函數。我指的方法是[here](https://github.com/EconForge/dolang/blob/827ee3d200d35709b8e112b90f8703223834bf75/src/compiler.jl#L132-L144) – spencerlyon2

+3

爲什麼你使用元編程?如果你只是取出'eval(parse(「''和相應的''))''並移除'$'符號,這個例子就可以工作。 – StefanKarpinski

回答

2

Stefan的評論是正確的;在這個特定的例子中,不需要元編程。但是,如果您想生成許多類似於ou[i] = x[i]^2 + x[i]但在複雜方面不同的行,則可以使用宏生成它們。請參閱http://docs.julialang.org/en/release-0.4/manual/metaprogramming/。宏會擴展爲「就地」生成代碼,就好像您自己輸入了代碼一樣,所以變量可以引用周圍的作用域。