]> code.delx.au - gnu-emacs/blobdiff - lisp/org/ob-maxima.el
Merge from trunk; up to 2014-02-23T23:41:17Z!lekktu@gmail.com.
[gnu-emacs] / lisp / org / ob-maxima.el
index 279ba6b928b5c9766a73e1bbd421fd3a91e4b493..7435f1d3286e407a6d16d59d9df053b63df09b77 100644 (file)
@@ -1,12 +1,11 @@
 ;;; ob-maxima.el --- org-babel functions for maxima evaluation
 
-;; Copyright (C) 2009-201 Free Software Foundation, Inc.
+;; Copyright (C) 2009-2014 Free Software Foundation, Inc.
 
 ;; Author: Eric S Fraga
-;;        Eric Schulte
+;;     Eric Schulte
 ;; Keywords: literate programming, reproducible research, maxima
 ;; Homepage: http://orgmode.org
-;; Version: 7.7
 
 ;; This file is part of GNU Emacs.
 
 ;;
 ;; 1) there is no such thing as a "session" in maxima
 ;;
-;; 2) we are generally only going to return output from maxima
-;;
-;; 3) we are adding the "cmdline" header argument
-;;
-;; 4) there are no variables
+;; 2) we are adding the "cmdline" header argument
 
 ;;; Code:
 (require 'ob)
 
+(defvar org-babel-tangle-lang-exts)
+(add-to-list 'org-babel-tangle-lang-exts '("maxima" . "max"))
+
 (defvar org-babel-default-header-args:maxima '())
 
+(defcustom org-babel-maxima-command
+  (if (boundp 'maxima-command) maxima-command "maxima")
+  "Command used to call maxima on the shell."
+  :group 'org-babel
+  :type 'string)
+
 (defun org-babel-maxima-expand (body params)
   "Expand a block of Maxima code according to its header arguments."
-  body)
+  (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")))
 
 (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'."
+  "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")
-  (let* ((result-params (split-string (or (cdr (assoc :results params)) "")))
-        (cmdline (cdr (assoc :cmdline params)))
-        (in-file (org-babel-temp-file "maxima-"))
-        (cmd (format "maxima --very-quiet -r 'batchload(%S)$' %s"
-                     in-file cmdline)))
-    (with-temp-file in-file (insert body))
-    (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 ""))))
+  (let ((result-params (split-string (or (cdr (assoc :results params)) "")))
+       (result
+        (let* ((cmdline (or (cdr (assoc :cmdline params)) ""))
+               (in-file (org-babel-temp-file "maxima-" ".max"))
+               (cmd (format "%s --very-quiet -r 'batchload(%S)$' %s"
+                            org-babel-maxima-command in-file cmdline)))
+          (with-temp-file in-file (insert (org-babel-maxima-expand body params)))
+          (message cmd)
+           ;; " | grep -v batch | grep -v 'replaced' | sed '/^$/d' "
+          (let ((raw (org-babel-eval cmd "")))
+             (mapconcat
+              #'identity
+              (delq nil
+                    (mapcar (lambda (line)
+                              (unless (or (string-match "batch" line)
+                                          (string-match "^rat: replaced .*$" line)
+                                          (string-match "^;;; Loading #P" line)
+                                          (= 0 (length line)))
+                                line))
+                            (split-string raw "[\r\n]"))) "\n")))))
+    (if (org-babel-maxima-graphical-output-file params)
+       nil
+      (org-babel-result-cond 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))))))
+
 
 (defun org-babel-prep-session:maxima (session params)
   (error "Maxima does not support sessions"))
 
+(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)))
+
+
 (provide 'ob-maxima)