ob-maxima.el 4.14 KB
Newer Older
1 2
;;; ob-maxima.el --- org-babel functions for maxima evaluation

3
;; Copyright (C) 2009-2012  Free Software Foundation, Inc.
4

5 6
;; Author: Eric S Fraga
;;	   Eric Schulte
7 8 9
;; Keywords: literate programming, reproducible research, maxima
;; Homepage: http://orgmode.org

10
;; This file is part of GNU Emacs.
11

12
;; GNU Emacs is free software: you can redistribute it and/or modify
13
;; it under the terms of the GNU General Public License as published by
14 15 16 17
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.

;; GNU Emacs is distributed in the hope that it will be useful,
18 19 20
;; 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.
21

22
;; You should have received a copy of the GNU General Public License
23
;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
24 25 26 27 28 29 30 31 32

;;; Commentary:

;; Org-Babel support for evaluating maxima entries.
;;
;; This differs from most standard languages in that
;;
;; 1) there is no such thing as a "session" in maxima
;;
Bastien Guerry's avatar
Bastien Guerry committed
33
;; 2) we are adding the "cmdline" header argument
34 35 36 37

;;; Code:
(require 'ob)

Bastien Guerry's avatar
Bastien Guerry committed
38 39 40
(defvar org-babel-tangle-lang-exts)
(add-to-list 'org-babel-tangle-lang-exts '("maxima" . "max"))

41 42 43 44
(defvar org-babel-default-header-args:maxima '())

(defun org-babel-maxima-expand (body params)
  "Expand a block of Maxima code according to its header arguments."
Bastien Guerry's avatar
Bastien Guerry committed
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
  (let ((vars (mapcar #'cdr (org-babel-get-header params :var))))
     (mapconcat 'identity
		(list
		 ;; graphic output
		 (let ((graphic-file (org-babel-maxima-graphical-output-file params)))
		   (if graphic-file
		       (format
			"set_plot_option ([gnuplot_term, png]); set_plot_option ([gnuplot_out_file, %S]);"
			graphic-file)
		     ""))
		 ;; variables
		 (mapconcat 'org-babel-maxima-var-to-maxima vars "\n")
		 ;; body
		 body
		 "gnuplot_close ()$")
		"\n")))
61 62 63 64 65

(defun org-babel-execute:maxima (body params)
  "Execute a block of Maxima entries with org-babel.  This function is
called by `org-babel-execute-src-block'."
  (message "executing Maxima source code block")
Bastien Guerry's avatar
Bastien Guerry committed
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
  (let ((result
	 (let* ((result-params (split-string (or (cdr (assoc :results params)) "")))
		(cmdline (cdr (assoc :cmdline params)))
		(in-file (org-babel-temp-file "maxima-" ".max"))
		(cmd (format "maxima --very-quiet -r 'batchload(%S)$' %s"
			     in-file cmdline)))
	   (with-temp-file in-file (insert (org-babel-maxima-expand body params)))
	   (message cmd)
	   ((lambda (raw) ;; " | grep -v batch | grep -v 'replaced' | sed '/^$/d' "
	      (mapconcat
	       #'identity
	       (delq nil
		     (mapcar (lambda (line)
			       (unless (or (string-match "batch" line)
					   (string-match "^rat: replaced .*$" line)
					   (= 0 (length line)))
				 line))
			     (split-string raw "[\r\n]"))) "\n"))
	    (org-babel-eval cmd "")))))
    (if (org-babel-maxima-graphical-output-file params)
	nil
      (if (or (member "scalar" result-params)
	      (member "verbatim" result-params)
	      (member "output" result-params))
	  result
	(let ((tmp-file (org-babel-temp-file "maxima-res-")))
	  (with-temp-file tmp-file (insert result))
	  (org-babel-import-elisp-from-file tmp-file))))))

95 96 97 98

(defun org-babel-prep-session:maxima (session params)
  (error "Maxima does not support sessions"))

Bastien Guerry's avatar
Bastien Guerry committed
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
(defun org-babel-maxima-var-to-maxima (pair)
  "Convert an elisp val into a string of maxima code specifying a var
of the same value."
  (let ((var (car pair))
        (val (cdr pair)))
    (when (symbolp val)
      (setq val (symbol-name val))
      (when (= (length val) 1)
        (setq val (string-to-char val))))
      (format "%S: %s$" var
	      (org-babel-maxima-elisp-to-maxima val))))

(defun org-babel-maxima-graphical-output-file (params)
  "Name of file to which maxima should send graphical output."
  (and (member "graphics" (cdr (assq :result-params params)))
       (cdr (assq :file params))))

(defun org-babel-maxima-elisp-to-maxima (val)
  "Return a string of maxima code which evaluates to VAL."
  (if (listp val)
      (concat "[" (mapconcat #'org-babel-maxima-elisp-to-maxima val ", ") "]")
    (format "%s" val)))


123 124
(provide 'ob-maxima)

125

126 127

;;; ob-maxima.el ends here