Extend ob-maxima: add input variables and graphic output
* lisp/ob-maxima.el (org-babel-tangle-lang-exts): Maxima extension. (org-babel-maxima-expand): Add input variables and graphic output. (org-babel-execute:maxima): Add input variables and graphic output. (org-babel-maxima-var-to-maxima): Add input variables and graphic output. (org-babel-maxima-graphical-output-file): Add input variables and graphic output. (org-babel-maxima-elisp-to-maxima): Add input variables and graphic output. * testing/examples/ob-maxima-test.org: Examples for new Maxima behavior.
This commit is contained in:
parent
6bbc3566f7
commit
8d3a4da034
|
@ -30,47 +30,90 @@
|
|||
;;
|
||||
;; 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 '())
|
||||
|
||||
(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'."
|
||||
(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
|
||||
(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
|
||||
result)))
|
||||
|
||||
|
||||
(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)
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,63 @@
|
|||
* Test org maxima file
|
||||
#+begin_src maxima :var s=4 :results silent
|
||||
print(s);
|
||||
#+end_src
|
||||
|
||||
Pass a string
|
||||
#+begin_src maxima :var fun="sin(x)" :var q=2 :results silent
|
||||
print(diff(fun, x, q));
|
||||
#+end_src
|
||||
|
||||
Graphic output
|
||||
#+begin_src maxima :var a=0.5 :results graphics :file maxima-test-sin.png
|
||||
plot2d(sin(a*x), [x, 0, 2*%pi])$
|
||||
#+end_src
|
||||
|
||||
#+begin_src maxima :results graphics :file maxima-test-3d.png
|
||||
plot3d (2^(-u^2 + v^2), [u, -3, 3], [v, -2, 2])$
|
||||
#+end_src
|
||||
|
||||
Output to a file
|
||||
#+begin_src maxima :file maxima-test-ouput.out
|
||||
for i:1 thru 10 do print(i)$
|
||||
#+end_src
|
||||
|
||||
List as input
|
||||
#+begin_src maxima :var a=(list 1 2 3)
|
||||
print(a+1);
|
||||
#+end_src
|
||||
|
||||
#+begin_src maxima :var a=(list 1 (list 1 2) 3)
|
||||
print(a+1);
|
||||
#+end_src
|
||||
|
||||
#+tblname: test_tbl_col
|
||||
| 1.0 |
|
||||
| 2.0 |
|
||||
|
||||
#+tblname: test_tbl_row
|
||||
| 1.0 | 2.0 |
|
||||
|
||||
Extra bracket? TODO:
|
||||
#+begin_src maxima :var s=test_tbl_col
|
||||
print(s+1.0);
|
||||
#+end_src
|
||||
|
||||
#+begin_src maxima :var s=test_tbl_row
|
||||
print(s+1.0);
|
||||
#+end_src
|
||||
|
||||
Matrix
|
||||
#+tblname: test_tbl_mtr
|
||||
| 1.0 | 1.0 |
|
||||
| 0.0 | 4.0 |
|
||||
|
||||
#+begin_src maxima :var s=test_tbl_mtr
|
||||
ms: apply(matrix, s);
|
||||
print(ms^^2);
|
||||
#+end_src
|
||||
|
||||
#+begin_src maxima :var s=test_tbl_mtr
|
||||
ms: apply(matrix, s);
|
||||
print(ms^^2);
|
||||
#+end_src
|
Loading…
Reference in New Issue