[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[O] [BABEL, PATCH] ob-maxima.el add variables and graphical output
From: |
Litvinov Sergey |
Subject: |
[O] [BABEL, PATCH] ob-maxima.el add variables and graphical output |
Date: |
Tue, 19 Jul 2011 19:02:16 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/23.2 (gnu/linux) |
I would like to contribute an extension of babel maxima support.
The patch adds variables and graphical output (currently limited to png
files). There is a file with examples (tests). It is not ERTed yet.
<org-mode>/testing/examples/ob-maxima-test.org
>From e383e0aa6e0a996033f86b8346205b1a38a124da Mon Sep 17 00:00:00 2001
From: Litvinov Sergey <address@hidden>
Date: Tue, 19 Jul 2011 00:33:52 +0200
Subject: [PATCH] Extend ob-maxima: add input variables and graphic output
---
lisp/ob-maxima.el | 91 +++++++++++++++++++++++++---------
testing/examples/ob-maxima-test.org | 63 ++++++++++++++++++++++++
2 files changed, 130 insertions(+), 24 deletions(-)
create mode 100644 testing/examples/ob-maxima-test.org
diff --git a/lisp/ob-maxima.el b/lisp/ob-maxima.el
index 6bd5d39..1344384 100644
--- a/lisp/ob-maxima.el
+++ b/lisp/ob-maxima.el
@@ -32,47 +32,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)
;; arch-tag: d86c97ac-7eab-4349-8d8b-302dd09779a8
diff --git a/testing/examples/ob-maxima-test.org
b/testing/examples/ob-maxima-test.org
new file mode 100644
index 0000000..23c76e7
--- /dev/null
+++ b/testing/examples/ob-maxima-test.org
@@ -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
--
1.7.4.1
- [O] [BABEL, PATCH] ob-maxima.el add variables and graphical output,
Litvinov Sergey <=