Hi all,

whenever I want to start a sub-REPL at a Slime REPL, it seems to
terminate immediately.

With "lein repl" it just works:

--8<---------------cut here---------------start------------->8---
user=> (clojure.main/repl :prompt #(print "foo=> "))
foo=> (+ 1 2)
3
foo=> ;; Waiting for another input...
--8<---------------cut here---------------end--------------->8---

With emacs 24 and clojure-mode-1.10.0 (M-x clojure-jack-in), and
swank-clojure-1.4.0-SNAPSHOT (installed with "lein plugin install
swank-clojure 1.4.0-SNAPSHOT", not in my :dev-dependencies):

--8<---------------cut here---------------start------------->8---
user> (clojure.main/repl :prompt #(print "foo=> "))
foo=> nil  ;; "foo=> " is immediately printed and nil returned
user>      ;; back at the old REPL...
--8<---------------cut here---------------end--------------->8---

So the sub-REPL prints its prompt and instantly terminates returning
nil.  This is really annoying, because it makes the use of the really
useful `break' macro shown in The Joy of Clojure's last chapter
impossible.  Here's the (slightly modified) code:

--8<---------------cut here---------------start------------->8---
(defn contextual-eval
  "Evals expr in the context ctx given as map.
  Example: (contextual-eval {'a 1, 'b 2} '(+ a b)) ;; => 3"
  [ctx expr]
  (eval
   `(let [~@(mapcat (fn [[k v]] [k `'~v]) ctx)]
      ~expr)))

(defn readr
  "Reads from *in* with the given promt, returns the given input or exit-code,
  if input was :c (continue)."
  [prompt exit-code]
  (let [input (clojure.main/repl-read prompt exit-code)]
    (if (= input :c)
      exit-code
      input)))

(defmacro local-context
  "Grabs the local context and returns it as a map."
  []
  (let [symbols (keys &env)]
    (zipmap (map (fn [sym] `(quote ~sym)) symbols) symbols)))

(defmacro break
  "Define a breakpoint with optional name s."
  [& [s]]
  `(clojure.main/repl
    :prompt #(print (str "debug"
                         ~(when s (str "(" s ")"))
                         "=> "))
    :read readr
    :eval (partial contextual-eval (local-context))))
--8<---------------cut here---------------end--------------->8---

It works just fine in a REPL started with "lein repl":

--8<---------------cut here---------------start------------->8---
user=> (let [a 1] (break))
debug=> (local-context)
{a 1}
debug=> a
1
debug=> :c
nil
user=>
--8<---------------cut here---------------end--------------->8---

However, if I do exactly the same in the Slime REPL in emacs, then the
break directly exits and you have no chance to inspect the local
context.

--8<---------------cut here---------------start------------->8---
user> (let [a 1] (break))
debug=> nil
user> 
--8<---------------cut here---------------end--------------->8---

Is there a way to get it working?

Bye,
Tassilo

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to