From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Eric Schulte" Subject: Re: Org-Babel - Clojure & Lazy Sequences Bug Date: Fri, 26 Nov 2010 13:29:53 -0700 Message-ID: <87k4jzltfi.fsf@gmail.com> References: <87k4kqpc4q.fsf@gmail.com> <87vd3lz4i0.fsf@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Return-path: Received: from [140.186.70.92] (port=52499 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PM4vk-0001N0-R6 for emacs-orgmode@gnu.org; Fri, 26 Nov 2010 15:30:07 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PM4vj-00070B-DT for emacs-orgmode@gnu.org; Fri, 26 Nov 2010 15:30:04 -0500 Received: from mail-pz0-f41.google.com ([209.85.210.41]:49831) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PM4vj-0006yf-13 for emacs-orgmode@gnu.org; Fri, 26 Nov 2010 15:30:03 -0500 Received: by pzk27 with SMTP id 27so2091434pzk.0 for ; Fri, 26 Nov 2010 12:30:01 -0800 (PST) In-Reply-To: (Rick Moynihan's message of "Thu, 25 Nov 2010 18:31:48 +0000") List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Rick Moynihan Cc: emacs-orgmode@gnu.org, Joel Boehland Hey Rick, Rick Moynihan writes: > Hey Eric, > > I've just run your ob-clojure, and it seems to work fine, though as > you mention it would be nice if it'd start slime (if it isn't already > running). > Alright, I'm going to fold this into the master branch (we'll still have the entirety of the existing ob-clojure in git for resurrection if need be). > > I'm not sure what you mean by "external evaluation", but have found > that if I do M-x slime-connect (to connect to an existing > clojure/swank vm) that I have access to the same vm, via the > *slime-repl* buffer, which is nice. Is this what you were referring > to, or was it something else? > So what I mean was execution outside of slime, e.g. by writing a code block to a temporary file and then executing that file with clj-env or some such Clojure scripting command. However the more I think about this the more I'm satisfied with slime, as it allows access to both local and remote virtual machines... > > Having access to other sessions seems like a useful feature, but I've > not begun to use these more advanced babel features. > > Anyway, great work; I really appreciate you working on this! > My pleasure, I use Clojure from within Org-mode files on a regular basis (these days I'm probably writing more Clojure than elisp), so this helps me too. Cheers -- Eric > > R. > > On 25 November 2010 17:40, Eric Schulte wrote: >> Hi Rick, >> >> I'm not quite sure what the best permanent solution would be. =C2=A0I'm >> tempted to switch to a drastically stripped down version of Clojure >> interaction which relies very heavily on slime. =C2=A0I'm attaching a fi= rst >> pass at this which allows for slime-based execution, can assign >> variables, handles lazy evaluation, etc... >> >> The downside to this new version is that it doesn't support buffer-based >> sessions or external evaluation, but the upside is that it is incredibly >> simple, and by relying so heavily on slime it should be very robust. >> >> Once this is enhanced with some code to start slime, and a simple >> :session setup (namely the ability to grab the slime context from a >> buffer specified by :session) I may prefer this to the existing >> ob-clojure. >> >> I'd be interested to hear what others think. =C2=A0Personally I'm happy = to >> lose external evaluation and switch to purely slime-based evaluation, >> but I don't want to trash it if it is an important part of someones work >> flow. >> >> Best -- Eric >> >> >> >> Rick Moynihan writes: >> >>> Hi Eric, >>> >>> Sorry for the delay in getting back to you. >>> >>> I can confirm the fix you quoted below works for me also. >>> >>> I've not been using any of the multiple session features, so I haven't >>> run into the other problems you mention. >>> >>> Any idea on what a more permanent solution might be? >>> >>> R. >>> >>> On 6 November 2010 17:58, Eric Schulte wrote: >>>> Hi Rick, >>>> >>>> I've noticed this as well. =C2=A0I'm not the original author of ob-clo= jure.el >>>> (Joel Boehland is), so I'm not sure how the clojure interaction >>>> currently works, although I know it makes heavy usage of slime. =C2=A0= There >>>> must be an existing mechanism used by slime to unroll these lazy >>>> evaluations, for example in the repl (range 10) *is* expanded >>>> >>>> user> (range 10) >>>> (0 1 2 3 4 5 6 7 8 9) >>>> >>>> I'm using clojure extensively in my studies so I have all the more >>>> reason to try to figure this out. =C2=A0I'll put this on my stack. >>>> >>>> BTW: I've noticed that I am unable to get Clojure code blocks to play >>>> nicely with existing slime sessions, say for example I have some large >>>> piece of data in scope in a slime sessions and I'd like to access that >>>> data from a clojure code block and dump some analysis to an Org-mode >>>> document. =C2=A0I have not yet found out how to make this work. =C2=A0= If you have, >>>> I'd love to hear how, otherwise I'll look into this as well. >>>> >>>> Best -- Eric >>>> >>>> Having just looked at this quickly, the following function over-defines >>>> `org-babel-execute:clojure' s.t. =C2=A0the body of the code block is s= ent to >>>> the superior list in the same manner as when calling `slime-eval-defun' >>>> from within a .clj file. =C2=A0While this doesn't handle starting up c= lojure >>>> instances or differentiate between session and external evaluation it >>>> should fix the issues mentioned above and could be the beginning of a >>>> permanent solution. >>>> >>>> #+begin_src emacs-lisp >>>> =C2=A0(defun org-babel-execute:clojure (body params) >>>> =C2=A0 =C2=A0(with-temp-buffer >>>> =C2=A0 =C2=A0 =C2=A0(insert body) >>>> =C2=A0 =C2=A0 =C2=A0(read >>>> =C2=A0 =C2=A0 =C2=A0 (slime-eval >>>> =C2=A0 =C2=A0 =C2=A0 =C2=A0`(swank:interactive-eval-region >>>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0,(buffer-substring-no-properties (po= int-min) (point-max))))))) >>>> #+end_src >>>> >>>> which then results in >>>> >>>> #+begin_src clojure >>>> =C2=A0(map (fn [el] (list el (* el el))) (range 10)) >>>> #+end_src >>>> >>>> evaluating to >>>> >>>> #+results: >>>> | 0 | =C2=A00 | >>>> | 1 | =C2=A01 | >>>> | 2 | =C2=A04 | >>>> | 3 | =C2=A09 | >>>> | 4 | 16 | >>>> | 5 | 25 | >>>> | 6 | 36 | >>>> | 7 | 49 | >>>> | 8 | 64 | >>>> | 9 | 81 | >>>> >>>> Rick Moynihan writes: >>>> >>>>> I have the following org file: >>>>> >>>>> #+BEGIN_SRC clojure >>>>> (range 10) >>>>> #+END_SRC >>>>> >>>>> #+results: >>>>> : clojure.lang.LazySeq@f35bf8c6 >>>>> >>>>> Where as I would expect to see the sequence. =C2=A0Evaluating the code >>>>> inside a doall doesn't seem to do anything either: >>>>> >>>>> #+BEGIN_SRC clojure >>>>> (doall (range 10)) >>>>> #+END_SRC >>>>> >>>>> #+results: >>>>> : clojure.lang.LazySeq@f35bf8c6 >>>>> >>>>> Is there any parameter I can pass to the block to get the code to >>>>> execute in a doall and return the sequence values rather than the >>>>> lazy-seq object itself? >>>>> >>>>> R. >>>>> >>>>> _______________________________________________ >>>>> Emacs-orgmode mailing list >>>>> Please use `Reply All' to send replies to the list. >>>>> Emacs-orgmode@gnu.org >>>>> http://lists.gnu.org/mailman/listinfo/emacs-orgmode >>>> >> >>