Re: [O] [BABEL,PATCH] ob-fortran, ert tests

2011-07-21 Thread Bastien
Hi Sergey,

Litvinov Sergey  writes:

> ob-fortran.el: fix a bug with string input, add ob-fortran tests with
> ert.

Applied, thanks!

-- 
 Bastien



[O] [BABEL,PATCH] ob-fortran, ert tests

2011-07-20 Thread Litvinov Sergey
ob-fortran.el: fix a bug with string input, add ob-fortran tests with
ert.
>From ed4e14fd509cad8d9ccc66bef570f2d8796213ca Mon Sep 17 00:00:00 2001
From: Litvinov Sergey 
Date: Thu, 21 Jul 2011 00:44:50 +0200
Subject: [PATCH] ob-fortran.el: fix bug with string input, add ob-fortran tests with ert

---
 contrib/babel/langs/ob-fortran.el|4 +-
 testing/README.org   |1 +
 testing/examples/ob-fortran-test.org |   86 +++---
 testing/lisp/test-ob-fortran.el  |   80 +++
 4 files changed, 131 insertions(+), 40 deletions(-)
 create mode 100644 testing/lisp/test-ob-fortran.el

diff --git a/contrib/babel/langs/ob-fortran.el b/contrib/babel/langs/ob-fortran.el
index f2f5cb2..6b0b144 100644
--- a/contrib/babel/langs/ob-fortran.el
+++ b/contrib/babel/langs/ob-fortran.el
@@ -142,8 +142,8 @@ of the same value."
  ((or (characterp val))
   (format "character, parameter :: %S = '%S'\n" var val))
  ((stringp val)
-  (format "character, parameter ::  %S(%d) = '%s'\n"
-  var (length val) val))
+  (format "character(len=%d), parameter ::  %S = '%s'\n"
+  (length val) var val))
  ((listp val)
   (format "real, parameter :: %S(%d) = %s\n"
 	  var (length val) (ob-fortran-transform-list val)))
diff --git a/testing/README.org b/testing/README.org
index 648a30d..3cc0487 100644
--- a/testing/README.org
+++ b/testing/README.org
@@ -78,6 +78,7 @@ First tangle this file out to your desktop.
   (org-id-update-id-locations
(list (concat org-dir "/testing/examples/babel.org")
  (concat org-dir "/testing/examples/normal.org")
+ (concat org-dir "/testing/examples/ob-fortran-test.org")
  (concat org-dir "/testing/examples/link-in-heading.org")
  (concat org-dir "/testing/examples/links.org")))
   
diff --git a/testing/examples/ob-fortran-test.org b/testing/examples/ob-fortran-test.org
index ade9f43..d48ae4e 100644
--- a/testing/examples/ob-fortran-test.org
+++ b/testing/examples/ob-fortran-test.org
@@ -1,76 +1,86 @@
-* Test org fortran file
-#+begin_src fortran
+#+Title: a collection of examples for ob-fortran tests
+#+OPTIONS: ^:nil
+
+* simple programs
+  :PROPERTIES:
+  :ID:   459384e8-1797-4f11-867e-dde0473ea7cc
+  :END:
+#+source: hello
+#+begin_src fortran :results silent
 print *, 'Hello world'
 #+end_src
 
-#+begin_src fortran
+#+source: fortran_parameter
+#+begin_src fortran :results silent
 integer, parameter :: i = 10
-print *, 'i = ', i
+write (*, '(i2)') i
 #+end_src
 
-#+begin_src fortran :var N = 10
-print *, 'N = ', N
+* variable resolution
+  :PROPERTIES:
+  :ID:   d8d1dfd3-5f0c-48fe-b55d-777997e02242
+  :END:
+#+begin_src fortran :var N = 15 :results silent
+write (*, '(i2)') N
 #+end_src
 
 Define for preprocessed fortran
-#+begin_src fortran :defines N 42
+#+begin_src fortran :defines N 42 :results silent
 implicit none
-print *, 'N = ', N
+write (*, '(i2)') N
 #+end_src
 
-#+begin_src fortran :var s="word"
-print *, 's = ', s
-print *, 'size(s) = ', size(s)
+#+begin_src fortran :var s="word" :results silent
+write (*, '(a4)') s
 #+end_src
-
-#+begin_src fortran :var s=42.0
-print *, 's = ', s
-print *, 'kind(s) = ', kind(s)
+* arrays
+  :PROPERTIES:
+  :ID:   c28569d9-04ce-4cad-ab81-1ea29f691465
+  :END:
+Real array as input
+#+begin_src fortran :var s='(1.0 2.0 3.0) :results silent
+write (*, '(3f5.2)'), s
 #+end_src
 
-#+begin_src fortran
-program ex
-print *, "output of ex program"
-end program ex
+#+tblname: test_tbl
+| 1.0 |
+| 2.0 |
+
+#+begin_src fortran :var s=test_tbl :results silent
+write (*, '(2f5.2)'), s
 #+end_src
 
+* failing
+  :PROPERTIES:
+  :ID:   891ead4a-f87a-473c-9ae0-1cf348bcd04f
+  :END:
 Should fail (TODO: add input variables for the case with explicit
 program statement)
-#+begin_src fortran :var s="word"
+#+begin_src fortran :var s="word" :results silent
 program ex
 print *, "output of ex program"
 end program ex
 #+end_src
 
-Real array as input
-#+begin_src fortran :var s='(1.0 2.0 3.0)
-print *, s
-#+end_src
-
-#+tblname: test_tbl
-| 1.0 |
-| 2.0 |
-
-Real array as input
-#+begin_src fortran :var s=test_tbl
-print *, s
-#+end_src
-
 Fails to compile (TODO: error check in ob-fortran.el)
-#+begin_src fortran :var s='(1 ())
+#+begin_src fortran :var s='(1 ()) :results silent
 print *, s
 #+end_src
 
 Should fail to compile with gfortran
-#+begin_src fortran :flags --std=f95 --pedantic-error
+#+begin_src fortran :flags --std=f95 --pedantic-error :results silent
 program ex
 integer*8 :: i
 end program ex
 #+end_src
 
+* programs input parameters
+  :PROPERTIES:
+  :ID:   2d5330ea-9934-4737-9ed6-e1d3dae2dfa4
+  :END:
 Pass parameters to the program
-#+begin_src fortran :cmdline "23"
+#+begin_src fortran :cmdline "23" :results silent
 character(len=255) :: cmd
-call get_command(cmd)
+call get_command_argument(1, cmd)
 write (*,*) trim(cmd)
 #+end_src
diff --git a/testing/lisp/test-ob-fortran.el b/testin

Re: [O] [BABEL,PATCH] ob-fortran

2011-07-18 Thread Eric Schulte
Hi Sergey,

Thank you for sharing ob-fortran.  After a quick scan it looks great,
and I would like to include it into the Org-mode core.

However a contribution of this size does require assignment of copyright
to the FSF.  See http://orgmode.org/worg/org-contribute.html#sec-2 for
information and instructions on the FSF assignment process.  Please let
me know if you will be able to assign copyright, I should be able to
include this into the core as soon as the process has begun.

Also, it is comforting to see a suite of test cases.  You may want to
consider wrapping these test cases up into ERT function so that they
could be folded into the remainder of the Org-mode test suite, I could
certainly help with this process.

Thanks! -- Eric

Litvinov Sergey  writes:

> 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 2ac9b86a6387cae1472e3ed288a3a133be72318c Mon Sep 17 00:00:00 2001
> From: Litvinov Sergey 
> Date: Mon, 18 Jul 2011 09:44:07 +0200
> Subject: [PATCH] Add fortran to babel
>
> ---
>  contrib/babel/langs/ob-fortran.el|  191 
> ++
>  testing/examples/ob-fortran-test.org |   76 ++
>  2 files changed, 267 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..6fdf416
> --- /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 .
> +
> +;;; 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-te

Re: [O] [BABEL,PATCH] ob-fortran

2011-07-18 Thread Bastien
Hi Sergey,

Litvinov Sergey  writes:

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

Great -- thanks a lot for this!

I let Eric (cc'ed) decide about integrating this in the contrib/ dir.

> diff --git a/contrib/babel/langs/ob-fortran.el 
> b/contrib/babel/langs/ob-fortran.el
> new file mode 100644
> index 000..6fdf416
> --- /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.

(Nitpicking: files in Org's contrib/ directory are *not* part of GNU
Emacs, only those in lisp/.)

Best,

-- 
 Bastien



[O] [BABEL,PATCH] ob-fortran

2011-07-18 Thread Litvinov Sergey
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 2ac9b86a6387cae1472e3ed288a3a133be72318c Mon Sep 17 00:00:00 2001
From: Litvinov Sergey 
Date: Mon, 18 Jul 2011 09:44:07 +0200
Subject: [PATCH] Add fortran to babel

---
 contrib/babel/langs/ob-fortran.el|  191 ++
 testing/examples/ob-fortran-test.org |   76 ++
 2 files changed, 267 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..6fdf416
--- /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 .
+
+;;; 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 :rowname-names params)) (cdr (assoc :rownames params)
+ (org-babel-trim
+   (org-babel-eval
+	(concat tmp-bin-file (if cmdline (concat " " cmdline) "")) "")
+
+(defun org-babel-fortran-expand (body params)
+  "Expand a block of fortran or fortran code with org-babel according to