2016-07-12 9 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は別の範囲に住んでいるようです。どのように私はそれがsyst!の引数からxを表すように、解析されたxを関数のスコープに持っていくことができますか?

ボーナス:私は700式のシステムを持っており、メタプログラミングを使用して「型指定」されやすいですが、システムの残差を計算する関数を作成するにはどうすればよいでしょうか?私は正しい方向にいたのですか?

+4

プレアルファ段階ですが、新しいパッケージDolang.jlはこれを行うことを目的としています。主なAPIのポイントは、いくつかのJulia式、許可された変数、その他の関数パラメータを取り、関数を出力する 'make_method'関数です。私が参照している方法は[ここ]です(https://github.com/EconForge/dolang/blob/827ee3d200d35709b8e112b90f8703223834bf75/src/compiler.jl#L132-L144) – spencerlyon2

+3

なぜメタプログラミングを使用していますか?この例は、 'eval(parse(" bit "と' '' '))'を取り出し、 '$'シンボルを削除するだけで動作します。 – StefanKarpinski

答えて

2

Stefanのコメントは正しいです。この特定の例では、メタプログラミングの必要はない。しかし、ou[i] = x[i]^2 + x[i]に似ていますが、複雑な方法で異なる多くの行を生成したい場合は、マクロを使ってそれらを生成することができます。 http://docs.julialang.org/en/release-0.4/manual/metaprogramming/を参照してください。マクロは、自分で入力したかのように "現場で"生成されたコードに展開されるので、変数は周囲のスコープを参照できます。

関連する問題