2016-07-12 4 views
3

메타 프로그래밍을 사용하여 방정식 시스템의 잔차를 계산하는 함수를 만들려고합니다.메타 프로그래밍을 사용하는 방정식 시스템

이것은 내가 지금까지 (장난감 예) 시도 것입니다 : I 함수를 계산하려고 할 때

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

사전 알파 단계이지만 새로운 패키지 Dolang.jl은이 작업을 목표로합니다. 주 API 포인트는 줄리아 표현식, 허용 된 변수, 다른 함수 매개 변수를 취하여 함수를 출력하는'make_method' 함수입니다. 내가 말하는 방법은 [여기] (https://github.com/EconForge/dolang/blob/827ee3d200d35709b8e112b90f8703223834bf75/src/compiler.jl#L132-L144) – spencerlyon2

+3

왜 메타 프로그래밍을 사용하고 있습니까? 이 예제는'eval (parse ("bit"와''''))'를 꺼내서'$'기호를 지우면 작동 할 것입니다. – StefanKarpinski

답변

2

스테판의 의견이 맞습니다. 이 특정 예에서는 메타 프로그래밍이 필요하지 않습니다. 그러나 ou[i] = x[i]^2 + x[i]과 유사하지만 복잡한 방법으로 다른 여러 줄을 생성하려면 매크로를 사용하여 줄을 생성 할 수 있습니다. http://docs.julialang.org/en/release-0.4/manual/metaprogramming/을 참조하십시오. 매크로는 자신이 입력 한 것처럼 "제자리에"생성 된 코드로 확장되므로 변수가 주변 범위를 참조 할 수 있습니다.

관련 문제