2009年12月5日土曜日

slime + swank-clojureが動かない

Clojure with Emacs and Slime/Swank on Ubuntuを参考にemacs + slime + swank-clojureでプログラミングしてるのだけれど、
最近のslimeとswank-clojureの組み合わせがこける。
SLIME REPL broken
を参考に、

"/home/hokari/opt/swank-clojure/src/main/clojure/swank/core/protocol.clj"


@@ -4,6 +4,20 @@

 ;; Read forms

+  (def #^{:private true}

+     *percent-re* #"%")

+


+(defn- fix-percent

+  "Replace double colons with a /."

+  ([text] (.replaceAll (re-matcher *percent-re* text) "?")))

+

+(def #^{:private true}

+     *double-colon-re* #"::")


+

+(defn- fix-double-colon
+  "Replace double colons with a /."

+  ([text] (.replaceAll (re-matcher *double-colon-re* text) "/")))

+

(def #^{:private true}

      *namespace-re* #"(^\(:emacs-rex \([a-zA-Z][a-zA-Z0-9]+):")


 (defn- fix-namespace

@@ -50,7 +64,7 @@

   ([#^java.io.Reader reader]

      (let [len  (Integer/parseInt (read-chars reader 6 read-fail-exception) 16)

            msg  (read-chars reader len read-fail-exception)


-           form (read-string (fix-namespace msg))]

+           form (read-string (fix-namespace (fix-double-colon (fix-percent msg))))]

        (if (seq? form)


          (deep-replace {'t true} form)

          form))))

のようなかんじにしたら動いた。
Common LispとClojureで"%"や"::"の意味とか許可/不許可が違うせい、
ということみたい。

2 件のコメント:

  1. このコメントは投稿者によって削除されました。

    返信削除
  2. ありがとうございます。
    参考にさせていただきました。
    上記の方法ですと、(format "%d" 100)が"?d"となってしまうようなので、以下のようにしてみました。
    とりあえず動いているようです。
    ご参考までに。

    --- a/src/swank/core/protocol.clj
    +++ b/src/swank/core/protocol.clj
    @@ -4,6 +4,12 @@

    ;; Read forms
    (def #^{:private true}
    + *fix-message-re* #"::%(.*?)%")
    +
    +(defn- fix-message [text]
    + (.replaceAll (re-matcher *fix-message-re* text) "/?$1?"))
    +
    +(def #^{:private true}
    *namespace-re* #"(^\(:emacs-rex \([a-zA-Z][a-zA-Z0-9]+):")

    (defn- fix-namespace
    @@ -50,7 +56,8 @@
    ([#^java.io.Reader reader]
    (let [len (Integer/parseInt (read-chars reader 6 read-fail-exception) 16)
    msg (read-chars reader len read-fail-exception)
    - form (read-string (fix-namespace msg))]
    +;; form (read-string (fix-namespace msg))]
    + form (read-string (fix-namespace (fix-message msg)))]
    (if (seq? form)
    (deep-replace {'t true} form)
    form))))

    返信削除