From: Litvinov Sergey <slitvinov@gmail.com>
To: emacs-orgmode@gnu.org
Cc: Litvinov Sergey <slitvinov@gmail.com>
Subject: [BABEL, PATCH] ob-maxima.el add variables and graphical output
Date: Tue, 19 Jul 2011 19:02:16 +0200 [thread overview]
Message-ID: <87oc0q6w6f.fsf@gmail.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 252 bytes --]
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
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: ob-maxima-patch --]
[-- Type: text/x-diff, Size: 5956 bytes --]
From e383e0aa6e0a996033f86b8346205b1a38a124da Mon Sep 17 00:00:00 2001
From: Litvinov Sergey <slitvinov@gmail.com>
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
next reply other threads:[~2011-07-19 17:03 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-07-19 17:02 Litvinov Sergey [this message]
2011-07-21 9:56 ` [BABEL, PATCH] ob-maxima.el add variables and graphical output Bastien
2011-07-21 17:10 ` Eric Schulte
2011-07-22 9:27 ` Bastien
2011-08-26 15:09 ` Eric S Fraga
2011-08-26 15:24 ` Eric Schulte
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87oc0q6w6f.fsf@gmail.com \
--to=slitvinov@gmail.com \
--cc=emacs-orgmode@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.