0

在尝试 gambit 的 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 回答