2011-10-04 40 views
2

当我得到一个真正意想不到的错误时,我正在调试我的Clojure程序Infocard Workbench:函数中的一个(swank.core/break)导致CLI窗口中止了执行的错误,即使正在运行的程序(-main)由Clojure/Swank REPL。当我注释掉break语句时,程序正常运行。为什么我从创建REPL的leiningen过程中得到错误,而不是从SWANK REPL本身得到错误?Clojure/Swank`break`退出封闭的Leiningen过程 - 为什么?

万一它很重要,该程序使用以下库:跷跷板(Swing UI); Piccolo2D(Swing 2D图形); Sedna(具有XQuery访问的XML数据库)。


堆栈跟踪如下。开始“GW COMMENT >>>”的行是我添加的注释行,不是跟踪的一部分。

--- BEGIN cli window output --- 

generic-sh-d: field-text is 
    GW COMMENT >>> Here, I'm in the menu handler for a file-open operation (Seesaw) 
shortname-hdlr: filename is t 
shortname-handler, inside 2nd 'let' 
reached display-file-icards 
    GW COMMENT >>> Here, I'm printing out actual XQueries to the Sedna database. 
declare default element namespace 'http://infoml.org/infomlFile'; for $base in doc('t', 'daily')/infomlFile/infoml[position() != 1] return $base/@cardId/string() 
unified-load, before 
declare default element namespace 'http://infoml.org/infomlFile'; 
for $base in collection('daily')/infomlFile/infoml[@cardId = 'gw667_110929221548137'] 
return ($base/data/title/string(), $base/data/content/string(), $base/selectors/tag/string()) 
    GW COMMENT >>> More XQueries; the "AFTER" indicates the query completed w/o crashing 
unified-load, AFTER 
unified-load, before 
declare default element namespace 'http://infoml.org/infomlFile'; 
for $base in collection('daily')/infomlFile/infoml[@cardId = 'gw667_110929221638791'] 
return ($base/data/title/string(), $base/data/content/string(), $base/selectors/tag/string()) 
unified-load, AFTER 

    GW COMMENT >>> omitted several before/AFTER pairs; all were successful 
    GW COMMENT >>> Here's the actual error; note the namespace, swank.core.connection 

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Var swank.core.connection/*current-connection* is unbound. 
     at clojure.lang.Var.deref(Var.java:142) 
     at clojure.lang.Var.get(Var.java:133) 
     at swank.core$send_to_emacs.invoke(core.clj:76) 
     at swank.core$sldb_loop.invoke(core.clj:203) 
     at swank.core$invoke_debugger.invoke(core.clj:214) 
     at infwb.sedna$display_file_icards.invoke(NO_SOURCE_FILE:1) 
     at infwb.misc_dialogs$shortname_handler.invoke(misc_dialogs.clj:76) 
     at infwb.core$make_app$open_h__3812.invoke(core.clj:37) 
     at seesaw.action$action$fn__386.invoke(action.clj:74) 
     at seesaw.action.proxy$javax.swing.AbstractAction$0.actionPerformed(Unknown Source) 
     at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028) 
     at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351) 
     at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) 
unified-load, AFTER 
display-file-icards: exited let-bindings 
     at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) 
     at javax.swing.AbstractButton.doClick(AbstractButton.java:389) 
     at com.apple.laf.ScreenMenuItem.actionPerformed(ScreenMenuItem.java:95) 
     at java.awt.MenuItem.processActionEvent(MenuItem.java:627) 
     at java.awt.MenuItem.processEvent(MenuItem.java:586) 
     at java.awt.MenuComponent.dispatchEventImpl(MenuComponent.java:337) 
     at java.awt.MenuComponent.dispatchEvent(MenuComponent.java:325) 
     at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:682) 
     at java.awt.EventQueue.access$000(EventQueue.java:85) 
     at java.awt.EventQueue$1.run(EventQueue.java:638) 
     at java.awt.EventQueue$1.run(EventQueue.java:636) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
     at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98) 
     at java.awt.EventQueue$2.run(EventQueue.java:652) 
     at java.awt.EventQueue$2.run(EventQueue.java:650) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87) 
     at java.awt.EventQueue.dispatchEvent(EventQueue.java:649) 
     at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296) 
     at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211) 
     at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196) 
     at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188) 
     at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 

     --- END cli window output --- 

下面是一个包含了break语句的函数:

回顾错误消息:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: 
Var swank.core.connection/*current-connection* is unbound. 

我看不出*current-connection*连接到执行一个斯旺克break消息。我的程序确实有一个名为*current-connection*的符号,但它在名称空间infwb.sedna中,它与我的REPL运行的命名空间不同,它是infwb.core

如果有人愿意,我可以发布更多Clojure源代码。感谢您花时间思考这个问题。

回答

0

不是说我对这是否会有所帮助,但我注意到swank-clojure is deprecated赞成nrepl。也许nrepl的作品?

我通过melpa存储库将我的nrepl支持添加到emacs,并通过M-xnrepl-jack-in添加了“jack in”。

我.emacs.d的相关位/ init.el样子(这将在Emacs24工作和更新版本):

(require 'package) 
(setq package-user-dir "~/.emacs.d/elpa/") 
(add-to-list 'package-archives 
      '("melpa" . "http://melpa.milkbox.net/packages/") t) 
(package-initialize) 

(when (not package-archive-contents) 
    (package-refresh-contents)) 

(defvar my-packages '(melpa 
         exec-path-from-shell 
         starter-kit 
         starter-kit-lisp 
         starter-kit-bindings 
         ess 
         clojure-mode 
         clojure-test-mode 
         paredit 
         ac-nrepl 
         nrepl 
         auto-complete 
         ac-nrepl 
         twilight-theme 
         auctex) 
    "A list of packages to ensure are installed at launch.") 

(dolist (p my-packages) 
    (when (not (package-installed-p p)) 
    (package-install p))) 

编辑:哎呀,只注意到了一年就这一个。我猜这对你来说可能不是问题了。