2013-01-16 2 views
1

줄리아 매크로를 사용하여 작업 할 때 시행 착오 프로그램으로 돌아가는 것처럼 보입니다. 표현식에 오류가 있으면 간단한 매크로를 작성하고 표현식이 실패하면 플래그를 설정하려고합니다. 호출 컨텍스트에서 표현식 (하나 이상의 지정 문을 포함 할 가능성이 높음)을 평가하기 때문에 매크로입니다. 그래서, 뭔가 같은 :줄리아 할당에서 오류를 잡을 매크로

macro flag_errors(ex) 
    broken = false 
    esc(quote 
     try 
      $(ex) 
     catch 
      broken = true 
     end 
    end) 
end 

나는 esc 기능을 중첩의 다양한 방법을 시도했습니다,하지만 난 제대로 호출 환경에서 할당을 평가하는 방법을 찾기 위해 아직 :

julia> @flag_errors a=2 
2 

julia> a 
a not defined 

julia> @flag_errors a=2+"X" 
true 

julia> a 
a not defined 

julia> broken 
broken not defined 

무엇을 이 매크로를 작성하는 올바른 방법은? try 블록이 문제의 원인입니까?

답변

1

새로운 범위 블록을 도입했기 때문에 try 블록이 여기에 있다고 생각합니다. ex의 과제를 분석하여 일반적으로이를 취소 할 수있는 꽤 심각한 메타 프로그래밍이 필요합니다. 왜 그것을 필요로합니까?

+0

extras/test.jl 향상을 위해 설치 블록에서 오류를 잡으려고합니다. 이상적으로는, 테스트 스위트 리포팅이 깨지지 않는 방식으로 에러가 잡힐 것입니다. – Harlan

3

나는 그것이 범위의 문제라는 점에 동의합니다. 예를 들어, 다음 코드를 실행 올바르게 지구 환경에 할당합니다

julia>@flag_errors global a = 2 
a 

julia>a 
2 

은 그래서 당신이 글로벌 환경에서 기존 a으로 OK 인 경우 문제를 해결합니다. 이 기능이 이미 다른 범위 (기능, 시도 등)에 있었다면 추가 실험을해야합니다.

건배.

2

여기 몇 가지 문제가 있습니다. 하나는 broken이라는 두 개의 관련이없는 변수가 있다는 것입니다. 하나는 매크로에, 다른 하나는 따옴표로 묶인 본문에 있습니다. 또 하나는 위생이 부족하여 식을 빠져 나가는 것입니다 - 매크로 확장기에 매크로 정의 컨텍스트가 아니라 매크로 호출자의 컨텍스트에서 평가되어야 함을 나타내려면 $(esc(ex))으로 보간되어야합니다. 그리고 마지막으로 Toivo가 언급 한 범위 문제가 있습니다. 이 작업을 새로운 블록에없는 것처럼 보이게 만드는 데 필요한 범위 분석은 불가능할 수도 있습니다. 나는 완전히 확신하지 못한다.