To be more precise, if you do a (print "something") in a cljs-script, that gets 
compiled and evaluated in the browser's js-vm, then the result is sent back 
thru a separate http-post and dispatched to the multimethod "handle-post" 
implementation for :print in clojurescript's cljs.repl.browser:

----------

(defmethod handle-post :print [{:keys [content order]} conn _ ]
    (do (constrain-order order (fn [] (do (print (read-string content))
                                         (.flush *out*))))
        (server/send-and-close conn 200 "ignore__"))))

----------

If you evaluate a cljs-form thru a direct call of cljs.repl/evaluate-form from 
a different thread than the cljs-repl, then any output from (print "something") 
will be printed in the cljs-repl terminal session and not the terminal where 
you invoked the cljs.repl/evaluate-form from.

That the "defmethod handle-post :print" cannot use the terminal's *out* where 
cljs.repl/evaluate-form is invoked, is understandable because it runs in a 
different thread.

The issue is that it's not just another thread, it seems a completely different 
context as the http-post handlers run asynchronous from any sent js-code.

This seems the reason that using any (binding [*out* terminal-out] 
(cljs.repl/evaluate-form …)) doesn't work - or I cannot make it work…

Right now I can make it work by saving the terminal's *out* in an atom and 
using it's value directly in the handle-post code, like:

----------

(def context-out (atom nil))

(defmethod handle-post :print [{:keys [content order]} conn _ ]
  (if @context-out
    (do (constrain-order order (fn [] (binding [*out* @context-out] 
                                        (do (print (read-string content))
                                            (.flush *out*)))))
        (server/send-and-close conn 200 "ignore__"))

    (do (constrain-order order (fn [] (do (print (read-string content))
                                          (.flush *out*))))
        (server/send-and-close conn 200 "ignore__"))))

----------

If I do (reset! cljs.repl.browser/context-out *out*) in the clj-repl, then the 
stdout of the cljs-repl gets redirected to my terminal… as I want.

However, it feels like a hack and I was hoping that I missed a better 
alternative… any suggestions or comments are most welcome.

Thanks, FrankS.




-- 
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