emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* [BABEL, PATCH] ob-maxima.el add variables and graphical output
@ 2011-07-19 17:02 Litvinov Sergey
  2011-07-21  9:56 ` Bastien
  2011-08-26 15:09 ` Eric S Fraga
  0 siblings, 2 replies; 6+ messages in thread
From: Litvinov Sergey @ 2011-07-19 17:02 UTC (permalink / raw)
  To: emacs-orgmode; +Cc: Litvinov Sergey

[-- 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


^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2011-08-26 15:25 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-07-19 17:02 [BABEL, PATCH] ob-maxima.el add variables and graphical output Litvinov Sergey
2011-07-21  9:56 ` 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

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).