Re: [O] I need help extending ob-ocaml to support :results output

2014-03-29 Thread Alan Schmitt
Hello,

Alan Schmitt alan.schm...@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




Re: [O] I need help extending ob-ocaml to support :results output

2014-03-29 Thread Bastien
Hi Alan,

Alan Schmitt alan.schm...@polytechnique.org writes:

 Should I push this patch?

Please go ahead,

-- 
 Bastien



Re: [O] I need help extending ob-ocaml to support :results output

2014-03-29 Thread Nicolas Goaziou
Hello,

Alan Schmitt alan.schm...@polytechnique.org writes:

 Should I push this patch?

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


Regards,

-- 
Nicolas Goaziou



Re: [O] I need help extending ob-ocaml to support :results output

2014-03-29 Thread Alan Schmitt
Nicolas Goaziou n.goaz...@gmail.com writes:

 Hello,

 Alan Schmitt alan.schm...@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




Re: [O] I need help extending ob-ocaml to support :results output

2014-03-29 Thread Nicolas Goaziou
Alan Schmitt alan.schm...@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



Re: [O] I need help extending ob-ocaml to support :results output

2014-03-29 Thread Alan Schmitt
Nicolas Goaziou n.goaz...@gmail.com writes:

 Alan Schmitt alan.schm...@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




Re: [O] I need help extending ob-ocaml to support :results output

2014-03-29 Thread Nicolas Goaziou
Alan Schmitt alan.schm...@polytechnique.org writes:

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

Thank you.

-- 
Nicolas Goaziou



Re: [O] I need help extending ob-ocaml to support :results output

2014-03-26 Thread Alan Schmitt
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

From bcc2fc7ae0e4d099481af229a79b06ae9a160f14 Mon Sep 17 00:00:00 2001
From: Alan Schmitt alan.schm...@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



Re: [O] I need help extending ob-ocaml to support :results output

2014-03-24 Thread Alan Schmitt
Eric Schulte schulte.e...@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



Re: [O] I need help extending ob-ocaml to support :results output

2014-03-23 Thread Eric Schulte
Alan Schmitt alan.schm...@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