2016-09-03 3 views
3

나는 Julia를 사용하기 시작했습니다. 함수의 변수 집합을 정의하기 위해 eval (Julia에서)을 사용하려고합니다. 이 전 2 동일한 v1을 설정하고 싶은 말은하자에 println 0을 반환 (V1의 초기 값) 이후,Julia에서 eval을 사용하여 varargs 처리

fun_test("v1", "2"); 

그것은 작동하지 않습니다

function fun_test(varargs...) 
    v1 = 0; 

    if length(varargs) > 0 
    j = collect(linspace(1,length(varargs)-1,length(varargs)/2)); 

    for i in j 
     expr_vargs = parse("$(varargs[i]) = $(varargs[i+1]);"); 
     eval(expr_vargs); 
    end 
    end 

    println(v1) 

end 

는 같은 함수를 호출. 그러나 Julia의 터미널에서 유사한 평가판 호출을 실행하면 작동합니다.

왜 작동하지 않는지와 문제를 해결하는 방법을 설명해주십시오.

+1

당신의'expr_vargs'는 괜찮습니다. 그것은 '평가판'입니다 ... – Memming

+0

안녕하세요 @. 무슨 뜻인지 분명히 설명해 주시겠습니까? – merch

+1

'eval'은 전역 범위에서 작동하지만'v1'은'v1 = 0' 행 때문에 로컬입니다. –

답변

5

eval은 기능 범위가 아닌 toplevel scope에서 실행됩니다. 함수 범위에서 바인딩을 동적으로 업데이트 할 수 없습니다. 정확한 사용 사례를 알지 못하면 동적 재 바인딩없이 작업을 수행 할 수있는 방법이 있다고 생각합니다. 특히 v1, v2 등은 아마 V 어레이로 만들어지는 것이 가장 좋습니다. 그럼에도 불구하고

, 당신이 정말, 당신은 항상 서브 모듈의 전역 변수로 v1를 정의 할 수 있습니다해야하는 경우 :

module FunTest 
v1 = 0 
function fun_test(varargs...) 

    if length(varargs) > 0 
    j = collect(linspace(1,length(varargs)-1,length(varargs)/2)); 

    for i in j 
     @eval $(varargs[i]) = $(varargs[i+1]) 
    end 
    end 

    println(v1) 

end 
export fun_test 
end 
using .FunTest 
fun_test(:v1, 2) # result: 2 

(나는 또한 최고의 수행 parse 보내고 문자열을 피하기 위해 코드를 수정 한

expression interpolation을 통해)

관련 문제