From 71b6ca8005898b8f6a971f42dafbad101b406e41 Mon Sep 17 00:00:00 2001 From: Eric Schulte Date: Sun, 10 May 2009 14:03:26 -0700 Subject: [PATCH] added `sbe' for evaluation of source blocks from emacs lisp --- litorgy/litorgy-table.el | 84 ++++++++++++++++++++++++++++++++++++++++ litorgy/litorgy.el | 4 +- rorg.org | 37 +++++++++++------- 3 files changed, 110 insertions(+), 15 deletions(-) create mode 100644 litorgy/litorgy-table.el diff --git a/litorgy/litorgy-table.el b/litorgy/litorgy-table.el new file mode 100644 index 000000000..b57392efc --- /dev/null +++ b/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 diff --git a/litorgy/litorgy.el b/litorgy/litorgy.el index 0b847b8be..b7b1dc9ab 100644 --- a/litorgy/litorgy.el +++ b/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")))) diff --git a/rorg.org b/rorg.org index 9a189bbb6..9b49a9a6c 100644 --- a/rorg.org +++ b/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