Конфигурация Clojure Slime
У меня есть lein 1.7 с плагином 1.4 swank. Затем я начинаю без конфигурации emacs и устанавливаю clojure-mode из marmalade, создаю новый проект с помощью lein, открываю project.clj, а затем выполняю Mx clojure-jack-in. Слизь начала просто отлично. Тогда я вхожу в это
; SLIME 20100404
user> (defn x[x]
(let [y (* x 2)]
(when (= y 2)
(throw (Exception. "hey")))
y))
#'user/x
user> (x 2)
4
user> (x 1)
Это бросает меня в отладчик, но похоже, что оно не завершено:
hey
[Thrown class java.lang.Exception]
Restarts:
0: [QUIT] Quit to the SLIME top level
Backtrace:
0: NO_SOURCE_FILE:1 user/x
[No Locals]
1: NO_SOURCE_FILE:1 user/eval1854
[No Locals]
2: Compiler.java:6465 clojure.lang.Compiler.eval
3: Compiler.java:6431 clojure.lang.Compiler.eval
4: core.clj:2795 clojure.core/eval
5: core.clj:532 swank.core/eval690[fn]
6: MultiFn.java:163 clojure.lang.MultiFn.invoke
7: basic.clj:54 swank.commands.basic/eval-region
8: basic.clj:44 swank.commands.basic/eval-region
9: basic.clj:78 swank.commands.basic/eval880[fn]
--more--
Местные жители не показаны. Нет возможности продолжить. Я посмотрел видео: http://vimeo.com/23932914 Как мне добраться до той же конфигурации slime / emacs / clojure.
2 ответа
Если я правильно понимаю, вы хотите видеть местных жителей в точке исключения, однако я считаю, что ваша проблема в том, что исключение будет поймано (после выхода из x
функция) вы уже вышли из стекового фрейма, где были определены местные жители.
Например, если вы установите точку останова....
user> (defn x [x]
(let [y (* x 2)]
(when (= 2 y)
(swank.core/break)
(throw (Exception. "hey")))))
user> (x 1)
Затем, когда вы достигаете точки останова и получаете трассировку стека, местные жители становятся доступными.
BREAK:
[Thrown class java.lang.Exception]
Restarts:
0: [QUIT] Quit to the SLIME top level
1: [CONTINUE] Continue from breakpoint
Backtrace:
0: NO_SOURCE_FILE:1 user/x
Locals:
x = 1
y = 2
1: NO_SOURCE_FILE:1 user/eval6821
2: Compiler.java:6465 clojure.lang.Compiler.eval
3: Compiler.java:6431 clojure.lang.Compiler.eval
4: core.clj:2795 clojure.core/eval
5: core.clj:532 swank.core/eval819[fn]
6: MultiFn.java:163 clojure.lang.MultiFn.invoke
7: basic.clj:54 swank.commands.basic/eval-region
8: basic.clj:44 swank.commands.basic/eval-region
9: basic.clj:78 swank.commands.basic/eval1009[fn]
--more--
копаться в источнике для (swank.core/break)
, Вы можете фактически захватить эти локальные привязки самостоятельно....
(defn x [x]
(let [y (* x 2)]
(when (= 2 y)
(swank.core/local-bindings)
(throw (Exception. "hey")))))
и вы получите ту же самую трассировку стека, что и выше, из исключения "эй"...
Подробнее здесь
Это видео показывает swank-clj, который был переименован в Ritz. Смотрите инструкции в репозитории о том, как установить и использовать его...