From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alan Schmitt Subject: Re: I need help extending ob-ocaml to support :results output Date: Wed, 26 Mar 2014 22:39:53 +0100 Message-ID: References: <87vbv4gxzl.fsf@gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:44605) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WSvYi-0006Tr-SQ for emacs-orgmode@gnu.org; Wed, 26 Mar 2014 17:40:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WSvYa-00077h-Uu for emacs-orgmode@gnu.org; Wed, 26 Mar 2014 17:40:28 -0400 Received: from mail3-relais-sop.national.inria.fr ([192.134.164.104]:58197) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WSvYa-00077J-Ng for emacs-orgmode@gnu.org; Wed, 26 Mar 2014 17:40:20 -0400 In-Reply-To: <87vbv4gxzl.fsf@gmail.com> (Eric Schulte's message of "Sun, 23 Mar 2014 19:50:54 -0600") List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Eric Schulte Cc: emacs-orgmode --=-=-= Content-Type: text/plain 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 --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-ob-ocaml.el-Clean-up-babel-evaluation-of-ocaml-block.patch >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 --=-=-=--