在gambit的gsi错误后让定义可见?

时间:2012-12-18 04:03:59

标签: scheme gambit

在尝试使用gambit的gsi(4.6.6)时,当我在let内输入无效内容时,我遇到了一个奇怪的情况。

按正常方式进行,一切都如预期。 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 and j是可见的。这几乎就像我仍然在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有点不同。 e.g。

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 个答案:

答案 0 :(得分:2)

这是Gambit交互式调试器的一个功能。

来自手册:http://www.iro.umontreal.ca/~gambit/doc/gambit-c.html#Debugging

  

然后在该点的上下文中启动嵌套的REPL   执行评估停止的地方。嵌套的REPL   延续和评估环境与要点相同   评估停止的地方。例如,在评估时   表达式'(let((y( - 1 1)))(*(/ x y)2))',“除以零”   报告错误,嵌套的REPL的继续是那个   获取结果并将其乘以2。 REPL的词汇   环境包括词汇变量'y'。这允许   检查评估环境(即词汇和动态   环境和延续),这对于特别有用   确定错误的确切位置和原因。

在您的情况下,嵌套的REPL在let内开始,因此绑定了ij