mirror of
https://git.savannah.gnu.org/git/emacs/org-mode.git
synced 2024-11-29 07:58:21 +00:00
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.
This commit is contained in:
parent
d25846b234
commit
c6aa8340ba
@ -79,16 +79,23 @@
|
||||
(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 +128,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.
|
||||
|
Loading…
Reference in New Issue
Block a user