2012-12-18 5 views
0

gambit의 gsi (4.6.6)를 실험하면서 잘못된 내부 입력을 입력 할 때 이상한 상황이 발생했습니다.gambit의 gsi에서 오류가 발생하면 정의를 표시 하시겠습니까?

일반적인 방법대로 모든 것이 예상대로입니다. i and j는 보이지 않습니다.

> (let ((i 4) (j 3)) (display (+ i j)) (newline)) 
7 
> i 
*** ERROR IN (console)@2.1 -- Unbound variable: i 
1> j 
*** ERROR IN (console)@3.1 -- Unbound variable: j 

그러나 let 블록을 사용하면 i andj가 표시됩니다. 그것은 마치 내가 let 형태의 범위 안에 아직도있는 것처럼 거의이다. 그게 무슨 일 이니? 또한, 프롬프트상의 숫자를 보면. > 1>`2> 등 정보가있는 것처럼 보입니다. 그렇다면 무엇입니까? 어쩌면 중첩 또는 오류 모드와 관련이 있을까요?

2> (let ((i 2) (j 3)) (display + i j) (newline)) 
*** ERROR IN (console)@4.20 -- Wrong number of arguments passed to procedure 
(display '#<procedure #2 +> 2 3) 
3> i 
2 
3> j 
3 

이것은 클로저와 조금 다릅니다. 예 :

user=> (defn display [n] (print n)) 
#'user/one-arg-function 
user=> (let [i 2 j 3] (display + i j) (println)) 
ArityException Wrong number of args (3) passed to: user$one-arg-function clojure.lang.AFn.throwArity (AFn.java:437) 

user=> i 
CompilerException java.lang.RuntimeException: Unable to resolve symbol: i in this context, compiling:(NO_SOURCE_PATH:0) 

user=> j 
CompilerException java.lang.RuntimeException: Unable to resolve symbol: j in this context, compiling:(NO_SOURCE_PATH:0) 
+1

샘플을 생성하기 전에 인터프리터를 다시 시작했습니다. – Bill

답변

2

이것은 Gambit의 대화 형 디버거의 기능입니다. 매뉴얼에서

:

중첩 REPL http://www.iro.umontreal.ca/~gambit/doc/gambit-c.html#Debugging 다음 평가를 중지 하였다 실행 시점의 문맥에서 개시된다. 중첩 된 REPL의 연속 및 평가 환경은 평가가 중단 된 지점 과 동일합니다. 예를 들어, 표현식 '(let ((y (- 1))) (* (/ xy) 2))'을 계산할 때 "0으로 나누기"오류가보고되고 중첩 된 REPL의 연속이 은 결과를 가져 와서 2로 곱합니다. REPL의 lexical 환경에는 어휘 변수 y가 포함됩니다. 이를 통해 평가 환경 (즉, 어휘 및 동적 환경 인 환경 및 계속)을 검사 할 수 있으며 이는 특히 에 유용하여 정확한 위치와 오류 원인을 결정할 수 있습니다. 귀하의 경우에는

는 중첩 된 REPL은 let 내부에서 시작하여 i와 결합 j했다.

+0

+1 "버그라고 부르지 말고, 기능이라고 부르세요.":). 농담 만하고, 디버깅 목적으로는 의미가 있습니다. –