emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: "Eric Schulte" <schulte.eric@gmail.com>
To: Rick Moynihan <rick.moynihan@gmail.com>
Cc: emacs-orgmode@gnu.org, Joel Boehland <joel.boehland@evocomputing.com>
Subject: Re: Org-Babel - Clojure & Lazy Sequences Bug
Date: Fri, 26 Nov 2010 13:29:53 -0700	[thread overview]
Message-ID: <87k4jzltfi.fsf@gmail.com> (raw)
In-Reply-To: <AANLkTi=iVVCy7X3a47WS0=eV68bp3sa7YS8-6fnf7d4T@mail.gmail.com> (Rick Moynihan's message of "Thu, 25 Nov 2010 18:31:48 +0000")

Hey Rick,

Rick Moynihan <rick.moynihan@gmail.com> 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 <schulte.eric@gmail.com> wrote:
>> Hi Rick,
>>
>> I'm not quite sure what the best permanent solution would be.  I'm
>> tempted to switch to a drastically stripped down version of Clojure
>> interaction which relies very heavily on slime.  I'm attaching a first
>> 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.  Personally 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 <rick.moynihan@gmail.com> 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 <schulte.eric@gmail.com> wrote:
>>>> Hi Rick,
>>>>
>>>> I've noticed this as well.  I'm not the original author of ob-clojure.el
>>>> (Joel Boehland is), so I'm not sure how the clojure interaction
>>>> currently works, although I know it makes heavy usage of slime.  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.  I'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.  I have not yet found out how to make this work.  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.  the body of the code block is sent to
>>>> the superior list in the same manner as when calling `slime-eval-defun'
>>>> from within a .clj file.  While this doesn't handle starting up clojure
>>>> 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
>>>>  (defun org-babel-execute:clojure (body params)
>>>>    (with-temp-buffer
>>>>      (insert body)
>>>>      (read
>>>>       (slime-eval
>>>>        `(swank:interactive-eval-region
>>>>          ,(buffer-substring-no-properties (point-min) (point-max)))))))
>>>> #+end_src
>>>>
>>>> which then results in
>>>>
>>>> #+begin_src clojure
>>>>  (map (fn [el] (list el (* el el))) (range 10))
>>>> #+end_src
>>>>
>>>> evaluating to
>>>>
>>>> #+results:
>>>> | 0 |  0 |
>>>> | 1 |  1 |
>>>> | 2 |  4 |
>>>> | 3 |  9 |
>>>> | 4 | 16 |
>>>> | 5 | 25 |
>>>> | 6 | 36 |
>>>> | 7 | 49 |
>>>> | 8 | 64 |
>>>> | 9 | 81 |
>>>>
>>>> Rick Moynihan <rick.moynihan@gmail.com> 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.  Evaluating 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
>>>>
>>
>>

  reply	other threads:[~2010-11-26 20:30 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-11-04 14:11 Rick Moynihan
2010-11-06 17:58 ` Eric Schulte
2010-11-24  1:51   ` Rick Moynihan
2010-11-25 17:40     ` Eric Schulte
2010-11-25 18:31       ` Rick Moynihan
2010-11-26 20:29         ` Eric Schulte [this message]
2010-11-26 20:53           ` Rick Moynihan
2010-11-26 22:49             ` Eric Schulte
2010-11-27  8:27               ` Achim Gratz
2010-11-27 15:20                 ` Eric Schulte
2010-11-28 23:23                   ` Rick Moynihan
2010-11-29  3:59                     ` Eric Schulte

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87k4jzltfi.fsf@gmail.com \
    --to=schulte.eric@gmail.com \
    --cc=emacs-orgmode@gnu.org \
    --cc=joel.boehland@evocomputing.com \
    --cc=rick.moynihan@gmail.com \
    --subject='Re: Org-Babel - Clojure & Lazy Sequences Bug' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Code repositories for project(s) associated with this inbox:

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).