diff options
author | Eric Schulte <schulte.eric@gmail.com> | 2010-07-16 15:00:11 -0700 |
---|---|---|
committer | Eric Schulte <schulte.eric@gmail.com> | 2010-07-16 15:23:15 -0700 |
commit | bc8d3a7704191d676028d1f6553963dc2a024d2c (patch) | |
tree | 3ec2d066b2a8fb4160473def86a1217431cc17bd | |
parent | 851611291ce600926bb2a3fb52b77ba6bf6de341 (diff) | |
download | org-mode-bc8d3a7704191d676028d1f6553963dc2a024d2c.tar.gz |
ob-ocaml: more robust handling of complex input/output values
* lisp/ob-ocaml.el (org-babel-expand-body:ocaml): now able to
initialize complex ocaml values without error
(org-babel-execute:ocaml): more sophisticated parsing of results,
only grabbing the line immediately preceding the eoe indicator
(org-babel-ocaml-elisp-to-ocaml): a new function for converting
complex elisp values like lists to ocaml syntax
(org-babel-ocaml-read-array): quoting arrays so that they aren't
interpreted as function calls
-rw-r--r-- | lisp/ob-ocaml.el | 47 |
1 files changed, 33 insertions, 14 deletions
diff --git a/lisp/ob-ocaml.el b/lisp/ob-ocaml.el index 5ca9b7e..e0e4334 100644 --- a/lisp/ob-ocaml.el +++ b/lisp/ob-ocaml.el @@ -41,7 +41,8 @@ (require 'comint) (eval-when-compile (require 'cl)) -(declare-function tuareg-run-caml "ext:taureg" ()) +(declare-function tuareg-run-caml "ext:tuareg" ()) +(declare-function tuareg-interactive-send-input "ext:tuareg" ()) (add-to-list 'org-babel-tangle-lang-exts '("ocaml" . "ml")) @@ -55,7 +56,8 @@ (let ((vars (nth 1 (or processed-params (org-babel-process-params params))))) (concat (mapconcat - (lambda (pair) (format "let %s = %s;" (car pair) (cdr pair))) + (lambda (pair) (format "let %s = %s;;" (car pair) + (org-babel-ocaml-elisp-to-ocaml (cdr pair)))) vars "\n") "\n" body "\n"))) (defun org-babel-execute:ocaml (body params) @@ -67,14 +69,24 @@ (cdr (assoc :session params)) params)) (raw (org-babel-comint-with-output (session org-babel-ocaml-eoe-output t full-body) - (insert (concat (org-babel-chomp full-body) " ;;")) - (comint-send-input nil t) - (insert org-babel-ocaml-eoe-indicator) - (comint-send-input nil t)))) + (insert + (concat + (org-babel-chomp full-body)"\n"org-babel-ocaml-eoe-indicator)) + (tuareg-interactive-send-input))) + (clean + (car (let ((re (regexp-quote org-babel-ocaml-eoe-output)) out) + (delq nil (mapcar (lambda (line) + (if out + (progn (setq out nil) line) + (when (string-match re line) + (progn (setq out t) nil)))) + (mapcar #'org-babel-trim (reverse raw)))))))) (org-babel-reassemble-table - (org-babel-ocaml-parse-output (org-babel-trim (car raw))) - (org-babel-pick-name (nth 4 processed-params) (cdr (assoc :colnames params))) - (org-babel-pick-name (nth 5 processed-params) (cdr (assoc :rownames params)))))) + (org-babel-ocaml-parse-output (org-babel-trim clean)) + (org-babel-pick-name + (nth 4 processed-params) (cdr (assoc :colnames params))) + (org-babel-pick-name + (nth 5 processed-params) (cdr (assoc :rownames params)))))) (defvar tuareg-interactive-buffer-name) (defun org-babel-prep-session:ocaml (session params) @@ -88,6 +100,12 @@ (save-window-excursion (tuareg-run-caml) (get-buffer tuareg-interactive-buffer-name)))) +(defun org-babel-ocaml-elisp-to-ocaml (val) + "Return a string of ocaml code which evaluates to VAL." + (if (listp val) + (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." @@ -125,11 +143,12 @@ Emacs-lisp table, otherwise return the results as a string." (org-babel-read (if (and (stringp results) (string-match "^\\[.+\\]$" results)) (org-babel-read - (replace-regexp-in-string - "\\[|" "(" (replace-regexp-in-string - "|\\]" ")" (replace-regexp-in-string - "; " " " (replace-regexp-in-string - "'" "\"" results))))) + (concat + "'" (replace-regexp-in-string + "\\[|" "(" (replace-regexp-in-string + "|\\]" ")" (replace-regexp-in-string + "; " " " (replace-regexp-in-string + "'" "\"" results)))))) results))) (provide 'ob-ocaml) |