Browse Source

added `sbe' for evaluation of source blocks from emacs lisp

Eric Schulte 16 years ago
parent
commit
71b6ca8005
3 changed files with 110 additions and 15 deletions
  1. 84 0
      litorgy/litorgy-table.el
  2. 2 2
      litorgy/litorgy.el
  3. 24 13
      rorg.org

+ 84 - 0
litorgy/litorgy-table.el

@@ -0,0 +1,84 @@
+;;; litorgy-table.el --- integration for calling litorgical functions from tables
+
+;; Copyright (C) 2009 Eric Schulte
+
+;; Author: Eric Schulte
+;; Keywords: literate programming, reproducible research
+;; Homepage: http://orgmode.org
+;; Version: 0.01
+
+;;; License:
+
+;; This program 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, or (at your option)
+;; any later version.
+;;
+;; This program 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; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; Should allow calling functions from org-mode tables using the
+;; function `sbe' as so...
+;; 
+;; #+begin_src emacs-lisp :results silent
+;; (defun fibbd (n) (if (< n 2) 1 (+ (fibbd (- n 1)) (fibbd (- n 2)))))
+;; #+end_src
+;; 
+;; #+srcname: fibbd
+;; #+begin_src emacs-lisp :var n=2 :results silent
+;; (fibbd n)
+;; #+end_src
+;; 
+;; | original | fibbd  |
+;; |----------+--------|
+;; |        0 |        |
+;; |        1 |        |
+;; |        2 |        |
+;; |        3 |        |
+;; |        4 |        |
+;; |        5 |        |
+;; |        6 |        |
+;; |        7 |        |
+;; |        8 |        |
+;; |        9 |        |
+;; #+TBLFM: $2='(sbe 'fibbd (n $1))
+
+;;; Code:
+(require 'litorgy)
+
+(defmacro sbe (source-block &rest variables)
+  "Return the results of calling SOURCE-BLOCK with all assigning
+every variable in VARIABLES.  Each element of VARIABLES should be
+a two element list, who's first element is the name of the
+variable and second element is a string of it's value.  The
+following call to `sbe' would be equivalent to the following
+source code block.
+
+ (sbe 'source-block (n 2) (m 3))
+
+#+begin_src emacs-lisp :var results=source-block(n=2, m=3) :results silent
+results
+#+end_src"
+  (message "sbe: executing source block")
+  (let ((params (eval `(litorgy-parse-header-arguments
+                        (concat ":var results="
+                                (symbol-name ,source-block)
+                                "("
+                                (mapconcat (lambda (var-spec)
+                                             (format "%S=%s" (first var-spec) (second var-spec)))
+                                           ',variables ", ")
+                                ")")))))
+    (message (format "litorgy-execute-src-block emacs-lisp results %S" (org-combine-plists params '((:results . "silent")))))
+    (litorgy-execute-src-block
+     nil (list "emacs-lisp" "results" (org-combine-plists params '((:results . "silent")))))))
+
+;;; litorgy-table.el ends here

+ 2 - 2
litorgy/litorgy.el

@@ -109,7 +109,7 @@ Optionally supply a value for INFO in the form returned by
 `litorgy-get-src-block-info'.
 
 Optionally supply a value for PARAMS which will be merged with
-the header arguments specified at the source code block." ; TODO implement!!
+the header arguments specified at the source code block."
   (interactive "P")
   (let* ((info (or info (litorgy-get-src-block-info)))
          (lang (first info))
@@ -195,7 +195,7 @@ silent -- no results are inserted"
   (if (= (length result) 0)
       (message "no result returned by source block")
     (if (and insert (string-equal insert "silent"))
-        (message (format "%S" result))
+        (progn (message (format "%S" result)) result)
       (when (and (stringp result)
                  (not (or (string-equal (substring result -1) "\n")
                           (string-equal (substring result -1) "\r"))))

+ 24 - 13
rorg.org

@@ -665,7 +665,7 @@ This is an inline source code block src_ruby{1 + 6}.  And another
 source block with text output src_emacs-lisp{"eric"}.
 
 This is an inline source code block with header
-arguments. src_ruby[:var n=fibbd( n = 0 )]{n}
+arguments.  src_ruby[:var n=fibbd( n = 0 )]{n}
 
 
 ** (sandbox) integration w/org tables
@@ -683,18 +683,29 @@ arguments. src_ruby[:var n=fibbd( n = 0 )]{n}
 (mapcar #'fibbd '(0 1 2 3 4 5 6 7 8))
 #+end_src
 
-| original | fibbd |
-|----------+-------|
-|        0 |       |
-|        1 |       |
-|        2 |       |
-|        3 |       |
-|        4 |       |
-|        5 |       |
-|        6 |       |
-|        7 |       |
-|        8 |       |
-|        9 |       |
+Something is not working here.  The function `sbe ' works fine when
+called from outside of the table (see the source block below), but
+produces an error when called from inside the table.  I think there
+must be some narrowing going on during intra-table emacs-lisp
+evaluation.
+
+| original | fibbd  |
+|----------+--------|
+|        0 | #ERROR |
+|        1 |        |
+|        2 |        |
+|        3 |        |
+|        4 |        |
+|        5 |        |
+|        6 |        |
+|        7 |        |
+|        8 |        |
+|        9 |        |
+#+TBLFM: @2$2='(sbe 'fibbd (n $1))
+
+#+begin_src emacs-lisp :results silent
+(sbe 'fibbd (n "8"))
+#+end_src
 
 
 * COMMENT Commentary