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	[flat|nested] 6+ messages in thread

* Re: [BABEL, PATCH] ob-maxima.el add variables and graphical output
  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-08-26 15:09 ` Eric S Fraga
  1 sibling, 1 reply; 6+ messages in thread
From: Bastien @ 2011-07-21  9:56 UTC (permalink / raw)
  To: Litvinov Sergey; +Cc: emacs-orgmode

Hi Sergey,

Litvinov Sergey <slitvinov@gmail.com> writes:

> 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

I let Eric S. handle this patch.

Btw, the first line of lisp/ob-maxima.el says the filename is
ob-babel-maxima.el -- Eric, can you fix this as well?

Thanks,

-- 
 Bastien

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

* Re: [BABEL, PATCH] ob-maxima.el add variables and graphical output
  2011-07-21  9:56 ` Bastien
@ 2011-07-21 17:10   ` Eric Schulte
  2011-07-22  9:27     ` Bastien
  0 siblings, 1 reply; 6+ messages in thread
From: Eric Schulte @ 2011-07-21 17:10 UTC (permalink / raw)
  To: Bastien; +Cc: Litvinov Sergey, emacs-orgmode

Bastien <bzg@altern.org> writes:

> Hi Sergey,
>
> Litvinov Sergey <slitvinov@gmail.com> writes:
>
>> 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
>
> I let Eric S. handle this patch.
>

Hi Sergey,

Thanks for this patch, it looks like a definite improvement to Babel's
maxima support.  Given the size of the patch (well over 10 lines), I
will hold this until the FSF process completes, at which point I will
happily apply this to the code base.

>
> Btw, the first line of lisp/ob-maxima.el says the filename is
> ob-babel-maxima.el -- Eric, can you fix this as well?
>

Fixed.

Thanks -- Eric

>
> Thanks,

-- 
Eric Schulte
http://cs.unm.edu/~eschulte/

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

* Re: [BABEL, PATCH] ob-maxima.el add variables and graphical output
  2011-07-21 17:10   ` Eric Schulte
@ 2011-07-22  9:27     ` Bastien
  0 siblings, 0 replies; 6+ messages in thread
From: Bastien @ 2011-07-22  9:27 UTC (permalink / raw)
  To: Eric Schulte; +Cc: Litvinov Sergey, emacs-orgmode

Hi Eric,

Eric Schulte <schulte.eric@gmail.com> writes:

> Thanks for this patch, it looks like a definite improvement to Babel's
> maxima support.  Given the size of the patch (well over 10 lines), I
> will hold this until the FSF process completes, at which point I will
> happily apply this to the code base.

Thanks for taking care of this.

I've changed the status of this patch to "under review" by you in the
patchwork. 

-- 
 Bastien

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

* Re: [BABEL, PATCH] ob-maxima.el add variables and graphical output
  2011-07-19 17:02 [BABEL, PATCH] ob-maxima.el add variables and graphical output Litvinov Sergey
  2011-07-21  9:56 ` Bastien
@ 2011-08-26 15:09 ` Eric S Fraga
  2011-08-26 15:24   ` Eric Schulte
  1 sibling, 1 reply; 6+ messages in thread
From: Eric S Fraga @ 2011-08-26 15:09 UTC (permalink / raw)
  To: Litvinov Sergey; +Cc: emacs-orgmode

Litvinov Sergey <slitvinov@gmail.com> writes:

> 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

Sergey,

thanks for this and sorry for delay in responding but I've been away and
am only now slowly catching up with things!

I've applied your patch to the most recent git org and everything seems
to work very well (my own tests and yours)!  I like both additions to
the functionality: variables and graphics.  Brilliant.

If others are happy, it would be great to see this patch applied.

Thanks again,
eric
-- 
: Eric S Fraga (GnuPG: 0xC89193D8FFFCF67D) in Emacs 24.0.50.1
: using Org-mode version 7.7 (release_7.7.205.gce02a.dirty)

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

* Re: [BABEL, PATCH] ob-maxima.el add variables and graphical output
  2011-08-26 15:09 ` Eric S Fraga
@ 2011-08-26 15:24   ` Eric Schulte
  0 siblings, 0 replies; 6+ messages in thread
From: Eric Schulte @ 2011-08-26 15:24 UTC (permalink / raw)
  To: Litvinov Sergey; +Cc: emacs-orgmode

Eric S Fraga <e.fraga@ucl.ac.uk> writes:

> Litvinov Sergey <slitvinov@gmail.com> writes:
>
>> 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
>
> Sergey,
>
> thanks for this and sorry for delay in responding but I've been away and
> am only now slowly catching up with things!
>
> I've applied your patch to the most recent git org and everything seems
> to work very well (my own tests and yours)!  I like both additions to
> the functionality: variables and graphics.  Brilliant.
>
> If others are happy, it would be great to see this patch applied.
>

As soon as Sergey's FSF assignment goes through we will apply this patch
and one other from Sergey to ob-C.

Best -- Eric

>
> Thanks again,
> eric

-- 
Eric Schulte
http://cs.unm.edu/~eschulte/

^ permalink raw reply	[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 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).