Пусть определения видны после ошибки в gsi гамбита?
При экспериментировании с gsi gambit (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
Это немного отличается от замыкания. например
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 ответ
Это особенность интерактивного отладчика Gambit.
Из руководства: http://www.iro.umontreal.ca/~gambit/doc/gambit-c.html
Вложенный REPL затем инициируется в контексте точки выполнения, где оценка была остановлена. Среда продолжения и оценки вложенного REPL совпадает с точкой, в которой оценка была остановлена. Например, при вычислении выражения "(let ((y (- 1 1))) (* (/ x y) 2))" сообщается об ошибке "деление на ноль", и продолжением вложенного REPL является то, которое принимает результат и умножает его на два. Лексическая среда REPL включает в себя лексическую переменную 'y'. Это позволяет проверить контекст оценки (т. Е. Лексическую и динамическую среду и продолжение), что особенно полезно для определения точного местоположения и причины ошибки.
В вашем случае вложенный REPL начался внутри let
и, таким образом, имел i
а также j
связаны.