emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Sergey Litvinov <slitvinov@gmail.com>
To: Litvinov Sergey <slitvinov@gmail.com>, emacs-orgmode@gnu.org
Subject: Re: [BABEL][PATCH] construct a table from the output of maxima code block
Date: Tue, 4 Oct 2011 19:57:07 +0200	[thread overview]
Message-ID: <CAEBOWYCi=-VcSfYdTT3cp_PtbL2KW8YCDWbmzhsCO1q+kdVVqA@mail.gmail.com> (raw)
In-Reply-To: <87ipo4rc24.fsf@ucl.ac.uk>

[-- Attachment #1: Type: text/plain, Size: 444 bytes --]

> In any case, can you please post a patch against the standard
> version?  Or, maybe easier, simply post ob-maxima.el as the other
> changes are not necessary for me to test your patch.

I though my previous patch was applied. It is still under review due to
copyright papers.  I am attaching a patch against master branch and
ob-maxima.el file.

The commit message is
ob-maxima.el: add input variables, png graphic
output, table as an output

[-- Attachment #2: 0001-ob-maxima.el-add-input-variables-graphic-output-to-p.patch --]
[-- Type: text/x-patch, Size: 4651 bytes --]

From d9cfa76e83c10e86ffacca3da7cbc83702268cc2 Mon Sep 17 00:00:00 2001
From: Litvinov Sergey <slitvinov@gmail.com>
Date: Tue, 4 Oct 2011 19:48:14 +0200
Subject: [PATCH] ob-maxima.el: add input variables, graphic output to png file, table as an output

---
 lisp/ob-maxima.el |   97 ++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 73 insertions(+), 24 deletions(-)

diff --git a/lisp/ob-maxima.el b/lisp/ob-maxima.el
index 085609c..9c39a5f 100644
--- a/lisp/ob-maxima.el
+++ b/lisp/ob-maxima.el
@@ -30,47 +30,96 @@
 ;;
 ;; 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
+      (if (or (member "scalar" result-params)
+	      (member "verbatim" result-params)
+	      (member "output" result-params))
+	  result
+	(let ((tmp-file (org-babel-temp-file "maxima-res-")))
+	  (with-temp-file tmp-file (insert result))
+	  (org-babel-import-elisp-from-file tmp-file))))))
+
 
 (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)
 
 
-- 
1.7.4.1


[-- Attachment #3: ob-maxima.el --]
[-- Type: text/x-emacs-lisp, Size: 4242 bytes --]

;;; ob-maxima.el --- org-babel functions for maxima evaluation

;; Copyright (C) 2009-2011  Free Software Foundation, Inc.

;; Author: Eric S Fraga
;;	   Eric Schulte
;; Keywords: literate programming, reproducible research, maxima
;; Homepage: http://orgmode.org

;; This file is part of GNU Emacs.

;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.

;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.

;;; Commentary:

;; Org-Babel support for evaluating maxima entries.
;;
;; This differs from most standard languages in that
;;
;; 1) there is no such thing as a "session" in maxima
;;
;; 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."
  (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
	 (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
      (if (or (member "scalar" result-params)
	      (member "verbatim" result-params)
	      (member "output" result-params))
	  result
	(let ((tmp-file (org-babel-temp-file "maxima-res-")))
	  (with-temp-file tmp-file (insert result))
	  (org-babel-import-elisp-from-file tmp-file))))))


(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)



;;; ob-maxima.el ends here

  reply	other threads:[~2011-10-04 17:57 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-10-01 20:37 Litvinov Sergey
2011-10-04 15:50 ` Eric S Fraga
2011-10-04 17:57   ` Sergey Litvinov [this message]
2011-10-06 14:51     ` Eric Schulte
2011-10-10  9:36     ` Eric S Fraga

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

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAEBOWYCi=-VcSfYdTT3cp_PtbL2KW8YCDWbmzhsCO1q+kdVVqA@mail.gmail.com' \
    --to=slitvinov@gmail.com \
    --cc=emacs-orgmode@gnu.org \
    --subject='Re: [BABEL][PATCH] construct a table from the output of maxima code block' \
    /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

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).