emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* Patch for asynchronous export of ocaml code
@ 2013-05-02 15:02 Alan Schmitt
  2013-05-03 15:57 ` Eric Schulte
  2013-05-06  6:22 ` Alan Schmitt
  0 siblings, 2 replies; 6+ messages in thread
From: Alan Schmitt @ 2013-05-02 15:02 UTC (permalink / raw)
  To: emacs-orgmode@gnu.org

[-- Attachment #1: Type: text/plain, Size: 2456 bytes --]

Hello,

It is not currently possible to asynchronously export the results of the
evaluation an ocaml babel block because the evaluation needs to start a toplevel
and thus asks the user what program to run. This of course blocks the
asynchronous export.

The attached patch adds a custom variable to specify the name of the command
to run, and directly calls the tuareg function that starts the toplevel given
the command.

For some context, here is the code that starts the caml session.

#+BEGIN_SRC emacs-lisp
(defvar tuareg-interactive-buffer-name)
(defun org-babel-prep-session:ocaml (session params)
  "Prepare SESSION according to the header arguments in PARAMS."
  (require 'tuareg)
  (let ((tuareg-interactive-buffer-name (if (and (not (string= session "none"))
                                                 (not (string= session "default"))
                                                 (stringp session))
                                            session
                                          tuareg-interactive-buffer-name)))
    (save-window-excursion
      (if (fboundp 'tuareg-run-caml) (tuareg-run-caml) (tuareg-run-ocaml))
      (get-buffer tuareg-interactive-buffer-name))))
#+END_SRC

And this is the code from tuareg that is run.

#+BEGIN_SRC emacs-lisp
;;;###autoload
(defun tuareg-run-ocaml ()
  "Run an OCaml toplevel process. I/O via buffer `*ocaml-toplevel*'."
  (interactive)
  (tuareg-run-process-if-needed)
  (display-buffer tuareg-interactive-buffer-name))

(defun tuareg-run-process-if-needed (&optional cmd)
  "Run an OCaml toplevel process if needed, with an optional command name.
I/O via buffer `*ocaml-toplevel*'."
  (if cmd
      (setq tuareg-interactive-program cmd)
    (unless (comint-check-proc tuareg-interactive-buffer-name)
      (setq tuareg-interactive-program
            (read-shell-command "OCaml toplevel to run: "
                                tuareg-interactive-program))))
  (unless (comint-check-proc tuareg-interactive-buffer-name)
    (let ((cmdlist (tuareg-args-to-list tuareg-interactive-program))
          (process-connection-type nil))
      (set-buffer (apply (function make-comint) "ocaml-toplevel"
                         (car cmdlist) nil (cdr cmdlist)))
      (tuareg-interactive-mode)
      (sleep-for 1))))
#+END_SRC

With this patch (and setting `org-confirm-babel-evaluate' to nil), I'm able to
export documents requiring the evaluation of caml code asynchronously.

Alan


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Babel-ocaml-allow-ocaml-code-to-run-during-asynchron.patch --]
[-- Type: text/x-patch, Size: 1898 bytes --]

From 065cba70ae83b9483636b399604a64c0530eb463 Mon Sep 17 00:00:00 2001
From: Alan Schmitt <alan.schmitt@polytechnique.org>
Date: Thu, 2 May 2013 16:57:29 +0200
Subject: [PATCH] Babel ocaml: allow ocaml code to run during asynchronous
 export

* lisp/ob-ocaml.el: Add a custom variable `org-babel-ocaml-command' to specify
the name of the toplevel to run.
(org-babel-prep-session:ocaml): Directly call `tuareg-run-process-if-needed'
with `org-babel-ocaml-command' as argument.
---
 lisp/ob-ocaml.el | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/lisp/ob-ocaml.el b/lisp/ob-ocaml.el
index 03500bb..1a194d8 100644
--- a/lisp/ob-ocaml.el
+++ b/lisp/ob-ocaml.el
@@ -51,6 +51,13 @@
 (defvar org-babel-ocaml-eoe-indicator "\"org-babel-ocaml-eoe\";;")
 (defvar org-babel-ocaml-eoe-output "org-babel-ocaml-eoe")
 
+(defcustom org-babel-ocaml-command "ocaml"
+  "Name of the command for executing Ocaml code."
+  :version "24.4"
+  :package-version '(Org . "8.0")
+  :group 'org-babel
+  :type 'string)
+
 (defun org-babel-execute:ocaml (body params)
   "Execute a block of Ocaml code with Babel."
   (let* ((vars (mapcar #'cdr (org-babel-get-header params :var)))
@@ -96,9 +103,10 @@
                                                  (stringp session))
                                             session
                                           tuareg-interactive-buffer-name)))
-    (save-window-excursion
-      (if (fboundp 'tuareg-run-caml) (tuareg-run-caml) (tuareg-run-ocaml))
-      (get-buffer tuareg-interactive-buffer-name))))
+    (if (fboundp 'tuareg-run-process-if-needed)
+        (tuareg-run-process-if-needed org-babel-ocaml-command)
+      (tuareg-run-caml))
+    (get-buffer tuareg-interactive-buffer-name)))
 
 (defun org-babel-variable-assignments:ocaml (params)
   "Return list of ocaml statements assigning the block's variables."
-- 
1.8.2.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: Patch for asynchronous export of ocaml code
  2013-05-02 15:02 Patch for asynchronous export of ocaml code Alan Schmitt
@ 2013-05-03 15:57 ` Eric Schulte
  2013-05-07  7:57   ` Alan Schmitt
  2013-05-07 12:18   ` Alan Schmitt
  2013-05-06  6:22 ` Alan Schmitt
  1 sibling, 2 replies; 6+ messages in thread
From: Eric Schulte @ 2013-05-03 15:57 UTC (permalink / raw)
  To: Alan Schmitt; +Cc: emacs-orgmode@gnu.org

This looks great, please apply this patch.

Thanks,

Alan Schmitt <alan.schmitt@polytechnique.org> writes:

> Hello,
>
> It is not currently possible to asynchronously export the results of the
> evaluation an ocaml babel block because the evaluation needs to start a toplevel
> and thus asks the user what program to run. This of course blocks the
> asynchronous export.
>
> The attached patch adds a custom variable to specify the name of the command
> to run, and directly calls the tuareg function that starts the toplevel given
> the command.
>
> For some context, here is the code that starts the caml session.
>
> #+BEGIN_SRC emacs-lisp
> (defvar tuareg-interactive-buffer-name)
> (defun org-babel-prep-session:ocaml (session params)
>   "Prepare SESSION according to the header arguments in PARAMS."
>   (require 'tuareg)
>   (let ((tuareg-interactive-buffer-name (if (and (not (string= session "none"))
>                                                  (not (string= session "default"))
>                                                  (stringp session))
>                                             session
>                                           tuareg-interactive-buffer-name)))
>     (save-window-excursion
>       (if (fboundp 'tuareg-run-caml) (tuareg-run-caml) (tuareg-run-ocaml))
>       (get-buffer tuareg-interactive-buffer-name))))
> #+END_SRC
>
> And this is the code from tuareg that is run.
>
> #+BEGIN_SRC emacs-lisp
> ;;;###autoload
> (defun tuareg-run-ocaml ()
>   "Run an OCaml toplevel process. I/O via buffer `*ocaml-toplevel*'."
>   (interactive)
>   (tuareg-run-process-if-needed)
>   (display-buffer tuareg-interactive-buffer-name))
>
> (defun tuareg-run-process-if-needed (&optional cmd)
>   "Run an OCaml toplevel process if needed, with an optional command name.
> I/O via buffer `*ocaml-toplevel*'."
>   (if cmd
>       (setq tuareg-interactive-program cmd)
>     (unless (comint-check-proc tuareg-interactive-buffer-name)
>       (setq tuareg-interactive-program
>             (read-shell-command "OCaml toplevel to run: "
>                                 tuareg-interactive-program))))
>   (unless (comint-check-proc tuareg-interactive-buffer-name)
>     (let ((cmdlist (tuareg-args-to-list tuareg-interactive-program))
>           (process-connection-type nil))
>       (set-buffer (apply (function make-comint) "ocaml-toplevel"
>                          (car cmdlist) nil (cdr cmdlist)))
>       (tuareg-interactive-mode)
>       (sleep-for 1))))
> #+END_SRC
>
> With this patch (and setting `org-confirm-babel-evaluate' to nil), I'm able to
> export documents requiring the evaluation of caml code asynchronously.
>
> Alan
>
>

-- 
Eric Schulte
http://cs.unm.edu/~eschulte

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Patch for asynchronous export of ocaml code
  2013-05-02 15:02 Patch for asynchronous export of ocaml code Alan Schmitt
  2013-05-03 15:57 ` Eric Schulte
@ 2013-05-06  6:22 ` Alan Schmitt
  1 sibling, 0 replies; 6+ messages in thread
From: Alan Schmitt @ 2013-05-06  6:22 UTC (permalink / raw)
  To: emacs-orgmode@gnu.org

Hello,

Can I apply this patch?

Thanks,

Alan

Alan Schmitt writes:

> Hello,
>
> It is not currently possible to asynchronously export the results of the
> evaluation an ocaml babel block because the evaluation needs to start a toplevel
> and thus asks the user what program to run. This of course blocks the
> asynchronous export.
>
> The attached patch adds a custom variable to specify the name of the command
> to run, and directly calls the tuareg function that starts the toplevel given
> the command.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Patch for asynchronous export of ocaml code
  2013-05-03 15:57 ` Eric Schulte
@ 2013-05-07  7:57   ` Alan Schmitt
  2013-05-07 12:18   ` Alan Schmitt
  1 sibling, 0 replies; 6+ messages in thread
From: Alan Schmitt @ 2013-05-07  7:57 UTC (permalink / raw)
  To: Eric Schulte; +Cc: emacs-orgmode@gnu.org


Eric Schulte writes:

> This looks great, please apply this patch.

Done.

Alan

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Patch for asynchronous export of ocaml code
  2013-05-03 15:57 ` Eric Schulte
  2013-05-07  7:57   ` Alan Schmitt
@ 2013-05-07 12:18   ` Alan Schmitt
  2013-05-07 12:52     ` Eric Schulte
  1 sibling, 1 reply; 6+ messages in thread
From: Alan Schmitt @ 2013-05-07 12:18 UTC (permalink / raw)
  To: Eric Schulte; +Cc: emacs-orgmode@gnu.org

Hello,

I just applied a small bugfix for this: it seems that the first time the
toplevel is started, something is mixed up in the buffers and the first
exported result end up in the toplevel buffer instead of the export
buffer. I put back the `save-window-excursion' around the code that
starts the toplevel to correct this.

Please let me know if it's again the custom to apply such tiny patch
without discussing it first on the list.

Best,

Alan

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Patch for asynchronous export of ocaml code
  2013-05-07 12:18   ` Alan Schmitt
@ 2013-05-07 12:52     ` Eric Schulte
  0 siblings, 0 replies; 6+ messages in thread
From: Eric Schulte @ 2013-05-07 12:52 UTC (permalink / raw)
  To: Alan Schmitt; +Cc: emacs-orgmode@gnu.org, Eric Schulte

Alan Schmitt <alan.schmitt@polytechnique.org> writes:

> Hello,
>
> I just applied a small bugfix for this: it seems that the first time the
> toplevel is started, something is mixed up in the buffers and the first
> exported result end up in the toplevel buffer instead of the export
> buffer. I put back the `save-window-excursion' around the code that
> starts the toplevel to correct this.
>
> Please let me know if it's again the custom to apply such tiny patch
> without discussing it first on the list.
>

I think such small patches, especially patches which do not change the
externally visible behavior, e.g., bug fixes and refactoring, may safely
be applied w/o discussion.

>
> Best,
>
> Alan

-- 
Eric Schulte
http://cs.unm.edu/~eschulte

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2013-05-07 12:53 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-05-02 15:02 Patch for asynchronous export of ocaml code Alan Schmitt
2013-05-03 15:57 ` Eric Schulte
2013-05-07  7:57   ` Alan Schmitt
2013-05-07 12:18   ` Alan Schmitt
2013-05-07 12:52     ` Eric Schulte
2013-05-06  6:22 ` Alan Schmitt

Code repositories for project(s) associated with this public 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).