org-mode/lisp/ob-lob.el

119 lines
4.0 KiB
EmacsLisp
Raw Normal View History

;;; ob-lob.el --- functions supporting the Library of Babel
;; Copyright (C) 2009, 2010 Free Software Foundation, Inc.
2009-10-29 23:03:43 +00:00
;; Author: Eric Schulte, Dan Davison
;; Keywords: literate programming, reproducible research
;; Homepage: http://orgmode.org
;; Version: 7.01trans
;; 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:
;; See the online documentation for more information
;;
;; http://orgmode.org/worg/org-contrib/babel/
;;; Code:
(require 'ob)
(require 'ob-table)
(defvar org-babel-library-of-babel nil
2010-07-13 23:20:08 +00:00
"Library of source-code blocks.
This is an association list. Populate the library by adding
files to `org-babel-lob-files'.")
(defcustom org-babel-lob-files '()
2010-07-13 23:20:08 +00:00
"Files used to populate the `org-babel-library-of-babel'.
To add files to this list use the `org-babel-lob-ingest' command."
:group 'org-babel
:type 'list)
2010-06-23 18:24:33 +00:00
;;;###autoload
(defun org-babel-lob-ingest (&optional file)
"Add all named source-blocks defined in FILE to
`org-babel-library-of-babel'."
(interactive "f")
(let ((lob-ingest-count 0))
(org-babel-map-src-blocks file
(let* ((info (org-babel-get-src-block-info))
(source-name (nth 4 info)))
(when source-name
(setq source-name (intern source-name)
org-babel-library-of-babel
(cons (cons source-name info)
(assq-delete-all source-name org-babel-library-of-babel))
lob-ingest-count (1+ lob-ingest-count)))))
(message "%d src block%s added to Library of Babel"
lob-ingest-count (if (> lob-ingest-count 1) "s" ""))))
(defconst org-babel-lob-call-aliases '("lob" "call")
2010-07-13 23:20:08 +00:00
"Aliases to call a source block function.
If you change the value of this variable then your files may
become unusable by other org-babel users, and vice versa.")
(defconst org-babel-lob-one-liner-regexp
(concat
"^\\([ \t]*\\)#\\+\\(?:"
(mapconcat #'regexp-quote org-babel-lob-call-aliases "\\|")
"\\):[ \t]+\\([^\(\)\n]+\\)\(\\([^\n]*\\)\)\\(\\[.+\\]\\|\\)[ \t]*\\([^\n]*\\)")
2010-07-13 23:20:08 +00:00
"Regexp to match calls to predefined source block functions.")
;; functions for executing lob one-liners
2010-06-23 18:24:33 +00:00
;;;###autoload
(defun org-babel-lob-execute-maybe ()
2010-07-13 23:20:08 +00:00
"Execute a Library of Babel source block, if appropriate.
Detect if this is context for a Library Of Babel source block and
if so then run the appropriate source block from the Library."
(interactive)
(let ((info (org-babel-lob-get-info)))
(if (nth 0 info) (progn (org-babel-lob-execute info) t) nil)))
2010-06-23 18:24:33 +00:00
;;;###autoload
(defun org-babel-lob-get-info ()
"Return a Library of Babel function call as a string."
(let ((case-fold-search t))
(save-excursion
(beginning-of-line 1)
(if (looking-at org-babel-lob-one-liner-regexp)
(append
(mapcar #'org-babel-clean-text-properties
(list
(format "%s(%s)%s"
(match-string 2) (match-string 3) (match-string 4))
(match-string 5)))
(list (length (match-string 1))))))))
(defun org-babel-lob-execute (info)
"Execute the lob call specified by INFO."
Enabling LoB to put results in buffer, and slowly moving towards more unified concept of function calls. Previously LoB calls were not able to produce results in the buffer. These changes go some way to allowing them to do that. [There are still some bugs to deal with]. That meant changing org-babel.el so that there is a notion of the `source block name' for a LoB line, in order to construct a #+resname (currently I've made the name the same as the function call). I'm also slowly moving towards unifying the notion of `function calls' a bit more: I've changed the org-babel-lob-one-liner-regexp so that instead of a monolithic match it now matches first the function name, and second the function arguments in parentheses. org-babel-lob-get-info makes that match, and although it still concatenates them and returns the string, the two elements can be accessed immediately afterwards using match-string. So that situation is very similar to org-babel-get-src-block-name, whose job (in this branch) is also to parse the function *name* and the function *arguments*. In a few places in the code (esp. function names), I think the word `info' should be replaced with `call' or `function call', which I believe more accurately indicates what the `info' is: a function definition, together with bound arguments/references. The function call syntax, i.e. function-name(arg1=ref1), originally introduced for references (and thereby in LoB), and which I'm proposing we use throughout, raises the question of default arguments, and those being over-ridden by supplied arguments, as in e.g. python, and R.
2009-07-11 02:59:10 +00:00
(let ((params (org-babel-merge-params
org-babel-default-header-args
(org-babel-params-from-buffer)
(org-babel-params-from-properties)
(org-babel-parse-header-arguments
(org-babel-clean-text-properties
(concat ":var results="
(mapconcat #'identity (butlast info) " ")))))))
(org-babel-execute-src-block
nil (list "emacs-lisp" "results" params nil nil (nth 2 info)))))
(provide 'ob-lob)
;; arch-tag: ce0712c9-2147-4019-ba3f-42341b8b474b
;;; ob-lob.el ends here