在尝试使用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)
答案 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
内开始,因此绑定了i
和j
。