Re: [O] [BABEL][PATCH] construct a table from the output of maxima code block

2011-10-04 Thread Sergey Litvinov
> 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
From d9cfa76e83c10e86ffacca3da7cbc83702268cc2 Mon Sep 17 00:00:00 2001
From: Litvinov Sergey 
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 ", "

[O] [org-babel] a patch with fortran support

2011-07-19 Thread Sergey Litvinov
Please consider an implementation of fortran support for
org-babel. The patch adds contrib/babel/langs/ob-fortran.el
(modification of lisp/ob-C.el) and
testing/examples/ob-fortran-test.org with tests.
From a18cbc80770d985d6ca6bdada07120f7daf65c02 Mon Sep 17 00:00:00 2001
From: Litvinov Sergey 
Date: Sun, 17 Jul 2011 15:31:03 +0200
Subject: [PATCH] Add fortran support to babel

---
 contrib/babel/langs/ob-fortran.el|  191 ++
 testing/examples/ob-fortran-test.org |   67 
 2 files changed, 258 insertions(+), 0 deletions(-)
 create mode 100644 contrib/babel/langs/ob-fortran.el
 create mode 100644 testing/examples/ob-fortran-test.org

diff --git a/contrib/babel/langs/ob-fortran.el b/contrib/babel/langs/ob-fortran.el
new file mode 100644
index 000..bb6948f
--- /dev/null
+++ b/contrib/babel/langs/ob-fortran.el
@@ -0,0 +1,191 @@
+;;; ob-fortran.el --- org-babel functions for fortran
+;; Copyright (C) 2010  Free Software Foundation, Inc.
+
+;; Author: Sergey Litvinov (based on ob-C.el by Eric Schulte)
+;; Keywords: literate programming, reproducible research, fortran
+;; Homepage: http://orgmode.org
+;; Version: 7.6
+
+;; 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 fortran code.
+;;
+
+;;; Code:
+
+;; Org-Babel support for evaluating fortran code.
+;;
+
+(require 'ob)
+(require 'ob-eval)
+(require 'cc-mode)
+
+(declare-function org-entry-get "org"
+		  (pom property &optional inherit literal-nil))
+
+(defvar org-babel-tangle-lang-exts)
+(add-to-list 'org-babel-tangle-lang-exts '("fortran" . "F90"))
+
+(defvar org-babel-default-header-args:fortran '())
+
+(defvar org-babel-fortran-compiler "gfortran"
+  "fortran command used to compile a fortran source code file into an
+  executable.")
+
+(defun org-babel-execute:fortran (body params)
+  "Execute BODY according to PARAMS.  This function calls
+`org-babel-execute:fortran'."
+  (org-babel-execute:fortran body params))
+
+(defun org-babel-execute:fortran (body params)
+"Execute a block of fortran code with org-babel.  This function is
+called by `org-babel-execute-src-block'."
+  (org-babel-fortran-execute body params))
+
+(defun org-babel-expand-body:fortran (body params)
+  "Expand a block of fortran code with org-babel according to it's
+header arguments (calls `org-babel-fortran-expand')."
+  (org-babel-fortran-expand body params))
+
+(defun org-babel-execute:fortran (body params)
+  "Execute a block of fortran code with org-babel.  This function is
+called by `org-babel-execute-src-block'."
+  (org-babel-fortran-execute body params))
+
+(defun org-babel-expand-body:fortran (body params)
+  "Expand a block of fortran code with org-babel according to it's
+header arguments (calls `org-babel-fortran-expand')."
+  (org-babel-fortran-expand body params))
+
+(defun org-babel-fortran-execute (body params)
+  "This function should only be called by `org-babel-execute:fortran'"
+  (let* ((tmp-src-file (org-babel-temp-file
+			"fortran-src-"
+			".F90"))
+ (tmp-bin-file (org-babel-temp-file "fortran-bin-"))
+ (cmdline (cdr (assoc :cmdline params)))
+ (flags (cdr (assoc :flags params)))
+ (full-body (org-babel-fortran-expand body params))
+ (compile
+	  (progn
+	(with-temp-file tmp-src-file (insert full-body))
+	(org-babel-eval
+	 (format "%s -o %s %s %s"
+		 org-babel-fortran-compiler
+		 (org-babel-process-file-name tmp-bin-file)
+		 (mapconcat 'identity
+(if (listp flags) flags (list flags)) " ")
+		 (org-babel-process-file-name tmp-src-file)) ""
+((lambda (results)
+   (org-babel-reassemble-table
+	(if (member "vector" (cdr (assoc :result-params params)))
+	(let ((tmp-file (org-babel-temp-file "f-")))
+	  (with-temp-file tmp-file (insert results))
+	  (org-babel-import-elisp-from-file tmp-file))
+	  (org-babel-read results))
+	(org-babel-pick-name
+	 (cdr (assoc :colname-names params)) (cdr (assoc :colnames params)))
+	(org-babel-pick-name
+	 (cdr (assoc :rownam