Re: [O] I need help extending ob-ocaml to support :results output
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
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
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
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
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
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
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
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
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
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