emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* I need help extending ob-ocaml to support :results output
@ 2014-03-21 16:35 Alan Schmitt
  2014-03-24  1:50 ` Eric Schulte
  0 siblings, 1 reply; 11+ messages in thread
From: Alan Schmitt @ 2014-03-21 16:35 UTC (permalink / raw)
  To: emacs-orgmode

Hello,

It seems that ob-ocaml does not support ":results output". For instance,
evaluating the following block:

#+begin_src ocaml :results output
Printf.printf "foo\nbar\n";;
#+end_src

Does not result in the two lines "foo" and "bar" but in the value being
returned.

Unfortunately I don't know enough of babel and emacs-lisp to extend
ob-ocaml to support this. Would someone be willing to guide me through
the `org-babel-execute:ocaml' function in ob-ocaml.el so that I can add
this functionality?

Thanks,

Alan

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

* Re: I need help extending ob-ocaml to support :results output
  2014-03-21 16:35 I need help extending ob-ocaml to support :results output Alan Schmitt
@ 2014-03-24  1:50 ` Eric Schulte
  2014-03-24 12:45   ` Alan Schmitt
  2014-03-26 21:39   ` Alan Schmitt
  0 siblings, 2 replies; 11+ messages in thread
From: Eric Schulte @ 2014-03-24  1:50 UTC (permalink / raw)
  To: Alan Schmitt; +Cc: emacs-orgmode

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

> Hello,
>
> It seems that ob-ocaml does not support ":results output". For instance,
> evaluating the following block:
>
> #+begin_src ocaml :results output
> Printf.printf "foo\nbar\n";;
> #+end_src
>
> Does not result in the two lines "foo" and "bar" but in the value being
> returned.
>
> Unfortunately I don't know enough of babel and emacs-lisp to extend
> ob-ocaml to support this. Would someone be willing to guide me through
> the `org-babel-execute:ocaml' function in ob-ocaml.el so that I can add
> this functionality?
>

You can step through the execution of `org-babel-execute:ocaml' by first
evaluating the function with a prefix argument (meaning with the cursor
within the function body press C-u C-A-x) which will edebug [1] the
function.

You can then evaluate an OCaml code block and when execution hits the
`org-babel-execute:ocaml' it will pause, and you can step through the
function by continuously pressing space bar.  In this way you can see
how the code is executed, and you can interactively look at the OCaml
session buffer to see where output is printed.  Pay special attention to
the `org-babel-comint-with-output' function, which is probably where
you'll need to make changes when the following holds.

  (member "output" (cdr (assoc :result-params params)))

You can also look for the string "output" in other ob-*.el language
files to see how output results are collected.

Hope this helps,

>
> Thanks,
>
> Alan
>


Footnotes: 
[1]  see (info "(elisp)Edebug")

-- 
Eric Schulte
https://cs.unm.edu/~eschulte
PGP: 0x614CA05D

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

* Re: I need help extending ob-ocaml to support :results output
  2014-03-24  1:50 ` Eric Schulte
@ 2014-03-24 12:45   ` Alan Schmitt
  2014-03-26 21:39   ` Alan Schmitt
  1 sibling, 0 replies; 11+ messages in thread
From: Alan Schmitt @ 2014-03-24 12:45 UTC (permalink / raw)
  To: Eric Schulte; +Cc: emacs-orgmode

Eric Schulte <schulte.eric@gmail.com> writes:

> You can step through the execution of `org-babel-execute:ocaml' by first
> evaluating the function with a prefix argument (meaning with the cursor
> within the function body press C-u C-A-x) which will edebug [1] the
> function.
>
> You can then evaluate an OCaml code block and when execution hits the
> `org-babel-execute:ocaml' it will pause, and you can step through the
> function by continuously pressing space bar.  In this way you can see
> how the code is executed, and you can interactively look at the OCaml
> session buffer to see where output is printed.  Pay special attention to
> the `org-babel-comint-with-output' function, which is probably where
> you'll need to make changes when the following holds.
>
>   (member "output" (cdr (assoc :result-params params)))
>
> You can also look for the string "output" in other ob-*.el language
> files to see how output results are collected.
>
> Hope this helps,

It does, thanks a lot.

Alan

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

* Re: I need help extending ob-ocaml to support :results output
  2014-03-24  1:50 ` Eric Schulte
  2014-03-24 12:45   ` Alan Schmitt
@ 2014-03-26 21:39   ` Alan Schmitt
  2014-03-29 11:07     ` Alan Schmitt
  1 sibling, 1 reply; 11+ messages in thread
From: Alan Schmitt @ 2014-03-26 21:39 UTC (permalink / raw)
  To: Eric Schulte; +Cc: emacs-orgmode

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

Hello,

Here is a patch that allows for the output of ocaml babel blocks to be
captured. It also makes the parsing of the resulting value more robust:
results of type "string list" are now converted to a table, for
instance.

At the moment I only check for results of the form "verbatim" or
"output" (before this patch, only "verbatim" was possible). Results of
kind "value" are parsed as before (converted to a string, a number,
a table, or left as-is).

Please don't hesitate to suggest improvements, to the code or to the
Changelog.

Thanks,

Alan


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-ob-ocaml.el-Clean-up-babel-evaluation-of-ocaml-block.patch --]
[-- Type: text/x-patch, Size: 3509 bytes --]

From bcc2fc7ae0e4d099481af229a79b06ae9a160f14 Mon Sep 17 00:00:00 2001
From: Alan Schmitt <alan.schmitt@polytechnique.org>
Date: Wed, 26 Mar 2014 22:23:53 +0100
Subject: [PATCH] ob-ocaml.el: Clean up babel evaluation of ocaml blocks

* ob-ocaml.el (org-babel-execute:ocaml): Capture the output, type, and
value when evaluating ocaml blocks. Return the one requested by
`results'.

(org-babel-ocaml-parse-output): Change the signature to take a type
and a value. Make the parsing of the type more robust.
---
 lisp/ob-ocaml.el | 55 +++++++++++++++++++++++++++++++------------------------
 1 file changed, 31 insertions(+), 24 deletions(-)

diff --git a/lisp/ob-ocaml.el b/lisp/ob-ocaml.el
index 1f29a25..b7ef2d1 100644
--- a/lisp/ob-ocaml.el
+++ b/lisp/ob-ocaml.el
@@ -79,16 +79,24 @@
 					 (progn (setq out nil) line)
 				       (when (string-match re line)
 					 (progn (setq out t) nil))))
-				   (mapcar #'org-babel-trim (reverse raw))))))))
+				   (mapcar #'org-babel-trim (reverse raw)))))))
+	 (raw (org-babel-trim clean))
+	 (result-params (cdr (assoc :result-params params)))
+	 (parsed 
+	  (string-match 
+	   "\\(\\(.*\n\\)*\\)[^:\n]+ : \\([^=\n]+\\) =\\(\n\\| \\)\\(.+\\)$" 
+	   raw))
+	 (output (match-string 1 raw))
+	 (type (match-string 3 raw))
+	 (value (match-string 5 raw))
+	 )
     (org-babel-reassemble-table
-     (let ((raw (org-babel-trim clean))
-	   (result-params (cdr (assoc :result-params params))))
-       (org-babel-result-cond result-params
-	 ;; strip type information from output unless verbatim is specified
-	 (if (and (not (member "verbatim" result-params))
-		  (string-match "= \\(.+\\)$" raw))
-	     (match-string 1 raw) raw)
-	 (org-babel-ocaml-parse-output raw)))
+     (org-babel-result-cond result-params
+       (cond
+	((member "verbatim" result-params) raw)
+	((member "output" result-params) output)
+	(t raw))
+       (org-babel-ocaml-parse-output value type))
      (org-babel-pick-name
       (cdr (assoc :colname-names params)) (cdr (assoc :colnames params)))
      (org-babel-pick-name
@@ -121,21 +129,20 @@
       (concat "[|" (mapconcat #'org-babel-ocaml-elisp-to-ocaml val "; ") "|]")
     (format "%S" val)))
 
-(defun org-babel-ocaml-parse-output (output)
-  "Parse OUTPUT.
-OUTPUT is string output from an ocaml process."
-  (let ((regexp "[^:]+ : %s = \\(.+\\)$"))
-    (cond
-     ((string-match (format regexp "string") output)
-      (org-babel-read (match-string 1 output)))
-     ((or (string-match (format regexp "int") output)
-          (string-match (format regexp "float") output))
-      (string-to-number (match-string 1 output)))
-     ((string-match (format regexp "list") output)
-      (org-babel-ocaml-read-list (match-string 1 output)))
-     ((string-match (format regexp "array") output)
-      (org-babel-ocaml-read-array (match-string 1 output)))
-     (t (message "don't recognize type of %s" output) output))))
+(defun org-babel-ocaml-parse-output (value type)
+  "Parse VALUE of type TYPE.
+VALUE and TYPE are string output from an ocaml process."
+  (cond
+   ((string= "string" type)
+    (org-babel-read value))
+   ((or (string= "int" type)
+	(string= "float" type))
+    (string-to-number value))
+   ((string-match "list" type)
+    (org-babel-ocaml-read-list value))
+   ((string-match "array" type)
+    (org-babel-ocaml-read-array value))
+   (t (message "don't recognize type %s" type) value)))
 
 (defun org-babel-ocaml-read-list (results)
   "Convert RESULTS into an elisp table or string.
-- 
1.8.5.3


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

* Re: I need help extending ob-ocaml to support :results output
  2014-03-26 21:39   ` Alan Schmitt
@ 2014-03-29 11:07     ` Alan Schmitt
  2014-03-29 11:26       ` Bastien
  2014-03-29 14:03       ` Nicolas Goaziou
  0 siblings, 2 replies; 11+ messages in thread
From: Alan Schmitt @ 2014-03-29 11:07 UTC (permalink / raw)
  To: Eric Schulte; +Cc: emacs-orgmode

Hello,

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

> Hello,
>
> Here is a patch that allows for the output of ocaml babel blocks to be
> captured. It also makes the parsing of the resulting value more robust:
> results of type "string list" are now converted to a table, for
> instance.
>
> At the moment I only check for results of the form "verbatim" or
> "output" (before this patch, only "verbatim" was possible). Results of
> kind "value" are parsed as before (converted to a string, a number,
> a table, or left as-is).
>
> Please don't hesitate to suggest improvements, to the code or to the
> Changelog.

Should I push this patch?

Thanks,

Alan

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

* Re: I need help extending ob-ocaml to support :results output
  2014-03-29 11:07     ` Alan Schmitt
@ 2014-03-29 11:26       ` Bastien
  2014-03-29 14:03       ` Nicolas Goaziou
  1 sibling, 0 replies; 11+ messages in thread
From: Bastien @ 2014-03-29 11:26 UTC (permalink / raw)
  To: Alan Schmitt; +Cc: emacs-orgmode, Eric Schulte

Hi Alan,

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

> Should I push this patch?

Please go ahead,

-- 
 Bastien

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

* Re: I need help extending ob-ocaml to support :results output
  2014-03-29 11:07     ` Alan Schmitt
  2014-03-29 11:26       ` Bastien
@ 2014-03-29 14:03       ` Nicolas Goaziou
  2014-03-29 18:23         ` Alan Schmitt
  1 sibling, 1 reply; 11+ messages in thread
From: Nicolas Goaziou @ 2014-03-29 14:03 UTC (permalink / raw)
  To: Alan Schmitt; +Cc: emacs-orgmode, Eric Schulte

Hello,

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

> Should I push this patch?

Nitpick: it is better to remove the dangling parenthesis prior to this. Thanks.


Regards,

-- 
Nicolas Goaziou

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

* Re: I need help extending ob-ocaml to support :results output
  2014-03-29 14:03       ` Nicolas Goaziou
@ 2014-03-29 18:23         ` Alan Schmitt
  2014-03-29 18:43           ` Nicolas Goaziou
  0 siblings, 1 reply; 11+ messages in thread
From: Alan Schmitt @ 2014-03-29 18:23 UTC (permalink / raw)
  To: Nicolas Goaziou; +Cc: emacs-orgmode, Eric Schulte

Nicolas Goaziou <n.goaziou@gmail.com> writes:

> Hello,
>
> Alan Schmitt <alan.schmitt@polytechnique.org> writes:
>
>> Should I push this patch?
>
> Nitpick: it is better to remove the dangling parenthesis prior to
> this. Thanks.

I'm sorry, but I don't see a dangling parenthesis. Where is it?

Thanks,

Alan

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

* Re: I need help extending ob-ocaml to support :results output
  2014-03-29 18:23         ` Alan Schmitt
@ 2014-03-29 18:43           ` Nicolas Goaziou
  2014-03-29 18:52             ` Alan Schmitt
  0 siblings, 1 reply; 11+ messages in thread
From: Nicolas Goaziou @ 2014-03-29 18:43 UTC (permalink / raw)
  To: Alan Schmitt; +Cc: emacs-orgmode, Eric Schulte

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

+				   (mapcar #'org-babel-trim (reverse raw)))))))
+	 (raw (org-babel-trim clean))
+	 (result-params (cdr (assoc :result-params params)))
+	 (parsed 
+	  (string-match 
+	   "\\(\\(.*\n\\)*\\)[^:\n]+ : \\([^=\n]+\\) =\\(\n\\| \\)\\(.+\\)$" 
+	   raw))
+	 (output (match-string 1 raw))
+	 (type (match-string 3 raw))
+	 (value (match-string 5 raw))
+	 )

         ^
Here.


Regards,

-- 
Nicolas Goaziou

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

* Re: I need help extending ob-ocaml to support :results output
  2014-03-29 18:43           ` Nicolas Goaziou
@ 2014-03-29 18:52             ` Alan Schmitt
  2014-03-29 19:08               ` Nicolas Goaziou
  0 siblings, 1 reply; 11+ messages in thread
From: Alan Schmitt @ 2014-03-29 18:52 UTC (permalink / raw)
  To: Nicolas Goaziou; +Cc: emacs-orgmode, Eric Schulte

Nicolas Goaziou <n.goaziou@gmail.com> writes:

> Alan Schmitt <alan.schmitt@polytechnique.org> writes:
>
> +				   (mapcar #'org-babel-trim (reverse raw)))))))
> +	 (raw (org-babel-trim clean))
> +	 (result-params (cdr (assoc :result-params params)))
> +	 (parsed 
> +	  (string-match 
> +	   "\\(\\(.*\n\\)*\\)[^:\n]+ : \\([^=\n]+\\) =\\(\n\\| \\)\\(.+\\)$" 
> +	   raw))
> +	 (output (match-string 1 raw))
> +	 (type (match-string 3 raw))
> +	 (value (match-string 5 raw))
> +	 )
>
>          ^
> Here.

OK, I put it on the previous line. I'll commit now.

Thanks,

Alan

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

* Re: I need help extending ob-ocaml to support :results output
  2014-03-29 18:52             ` Alan Schmitt
@ 2014-03-29 19:08               ` Nicolas Goaziou
  0 siblings, 0 replies; 11+ messages in thread
From: Nicolas Goaziou @ 2014-03-29 19:08 UTC (permalink / raw)
  To: Alan Schmitt; +Cc: emacs-orgmode, Eric Schulte

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

> OK, I put it on the previous line. I'll commit now.

Thank you.

-- 
Nicolas Goaziou

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

end of thread, other threads:[~2014-03-29 19:07 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-03-21 16:35 I need help extending ob-ocaml to support :results output Alan Schmitt
2014-03-24  1:50 ` Eric Schulte
2014-03-24 12:45   ` Alan Schmitt
2014-03-26 21:39   ` Alan Schmitt
2014-03-29 11:07     ` Alan Schmitt
2014-03-29 11:26       ` Bastien
2014-03-29 14:03       ` Nicolas Goaziou
2014-03-29 18:23         ` Alan Schmitt
2014-03-29 18:43           ` Nicolas Goaziou
2014-03-29 18:52             ` Alan Schmitt
2014-03-29 19:08               ` Nicolas Goaziou

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