0

ガンビットのgsi(4.6.6)を試しているときに、let内に無効なものを入力すると、奇妙な状況に遭遇しました。

通常の方法で行うと、すべてが期待どおりです。i andjは表示されません。

> (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

これはclojureとは少し異なります。例えば

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) 
4

1 に答える 1

2

これは、Gambit の対話型デバッガーの機能です。

マニュアルから: http://www.iro.umontreal.ca/~gambit/doc/gambit-c.html#Debugging

次に、ネストされた REPL が、評価が停止された実行ポイントのコンテキストで開始されます。ネストされた REPL の継続および評価環境は、評価が停止された時点と同じです。たとえば、式 '(let ((y (- 1 1))) (* (/ xy) 2))' を評価すると、「ゼロ除算」エラーが報告され、ネストされた REPL の継続は、結果を 2 倍します。REPL のレキシカル環境には、レキシカル変数 'y' が含まれています。これにより、評価コンテキスト (つまり、レキシカルおよび動的環境と継続) の検査が可能になります。これは、エラーの正確な場所と原因を特定するのに特に役立ちます。

あなたの場合、ネストされた REPL は内部で開始されたため、バインドされletていました。ij

于 2012-12-18T15:48:06.500 に答える