Re: [O] I need help extending ob-ocaml to support :results output
Alan Schmitt 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
Nicolas Goaziou writes: > Alan Schmitt 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 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 writes: > Hello, > > Alan Schmitt 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
Hello, Alan Schmitt 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
Hi Alan, Alan Schmitt 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 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
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 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 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 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
[O] I need help extending ob-ocaml to support :results output
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