| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- ;;; org-babel-ocaml.el --- org-babel functions for ocaml evaluation
- ;; Copyright (C) 2009 Eric Schulte
- ;; Author: Eric Schulte
- ;; Keywords: literate programming, reproducible research
- ;; Homepage: http://orgmode.org
- ;; Version: 0.01
- ;;; License:
- ;; This program is free software; you can redistribute it and/or modify
- ;; it under the terms of the GNU General Public License as published by
- ;; the Free Software Foundation; either version 3, or (at your option)
- ;; any later version.
- ;;
- ;; This program is distributed in the hope that it will be useful,
- ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
- ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ;; GNU General Public License for more details.
- ;;
- ;; You should have received a copy of the GNU General Public License
- ;; along with GNU Emacs; see the file COPYING. If not, write to the
- ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- ;; Boston, MA 02110-1301, USA.
- ;;; Commentary:
- ;; Org-Babel support for evaluating ocaml source code. This one will
- ;; be sort of tricky because ocaml programs must be compiled before
- ;; they can be run, but ocaml code can also be run through an
- ;; interactive interpreter.
- ;;
- ;; For now lets only allow evaluation using the ocaml interpreter.
- ;;; Requirements:
- ;; - tuareg-mode :: http://www-rocq.inria.fr/~acohen/tuareg/
- ;;; Code:
- (require 'org-babel)
- (require 'tuareg)
- (org-babel-add-interpreter "ocaml")
- (add-to-list 'org-babel-tangle-langs '("ocaml" "ml"))
- (defvar org-babel-ocaml-eoe-indicator "\"org-babel-ocaml-eoe\";;")
- (defvar org-babel-ocaml-eoe-output "- : string = \"org-babel-ocaml-eoe\"")
- (defun org-babel-execute:ocaml (body params)
- "Execute a block of Ocaml code with org-babel. This function
- is called by `org-babel-execute-src-block' with the following
- variables pre-set using `multiple-value-bind'.
- (session vars result-params result-type)"
- (message "executing Ocaml source code block")
- (let* ((full-body (concat
- (mapconcat
- (lambda (pair) (format "let %s = %s;" (car pair) (cdr pair)))
- vars "\n") "\n" body "\n"))
- (session (get-buffer (org-babel-prep-session:ocaml session params)))
- (raw (org-babel-comint-with-output session org-babel-ocaml-eoe-output t
- (insert full-body)
- (insert ";;")
- (comint-send-input nil t)
- (insert org-babel-ocaml-eoe-indicator)
- (comint-send-input nil t))))
- (org-babel-trim (car raw))))
- (defun org-babel-prep-session:ocaml (session params)
- "Prepare SESSION according to the header arguments specified in PARAMS."
- (tuareg-run-caml) tuareg-interactive-buffer-name)
- (provide 'org-babel-ocaml)
- ;;; org-babel-ocaml.el ends here
|