Commit | Line | Data |
---|---|---|
3ab2c837 | 1 | ;;; ob-lisp.el --- org-babel functions for common lisp evaluation |
afe98dfa | 2 | |
b73f1974 | 3 | ;; Copyright (C) 2009-2012 Free Software Foundation, Inc. |
afe98dfa | 4 | |
dfd98937 BG |
5 | ;; Authors: Joel Boehland |
6 | ;; Eric Schulte | |
7 | ;; David T. O'Toole <dto@gnu.org> | |
3ab2c837 | 8 | ;; Keywords: literate programming, reproducible research |
afe98dfa | 9 | ;; Homepage: http://orgmode.org |
afe98dfa | 10 | |
3ab2c837 | 11 | ;; This file is part of GNU Emacs. |
afe98dfa | 12 | |
3ab2c837 | 13 | ;; GNU Emacs is free software: you can redistribute it and/or modify |
afe98dfa | 14 | ;; it under the terms of the GNU General Public License as published by |
3ab2c837 BG |
15 | ;; the Free Software Foundation, either version 3 of the License, or |
16 | ;; (at your option) any later version. | |
17 | ||
18 | ;; GNU Emacs is distributed in the hope that it will be useful, | |
afe98dfa CD |
19 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
20 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
21 | ;; GNU General Public License for more details. | |
3ab2c837 | 22 | |
afe98dfa | 23 | ;; You should have received a copy of the GNU General Public License |
3ab2c837 | 24 | ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. |
afe98dfa CD |
25 | |
26 | ;;; Commentary: | |
27 | ||
3ab2c837 | 28 | ;;; support for evaluating common lisp code, relies on slime for all eval |
afe98dfa CD |
29 | |
30 | ;;; Requirements: | |
31 | ||
32 | ;; Requires SLIME (Superior Lisp Interaction Mode for Emacs.) | |
33 | ;; See http://common-lisp.net/project/slime/ | |
34 | ||
35 | ;;; Code: | |
36 | (require 'ob) | |
acedf35c CD |
37 | |
38 | (declare-function slime-eval "ext:slime" (sexp &optional package)) | |
afe98dfa | 39 | |
3ab2c837 BG |
40 | (defvar org-babel-tangle-lang-exts) |
41 | (add-to-list 'org-babel-tangle-lang-exts '("lisp" . "lisp")) | |
afe98dfa | 42 | |
3ab2c837 | 43 | (defvar org-babel-default-header-args:lisp '()) |
8223b1d2 | 44 | (defvar org-babel-header-args:lisp '((package . :any))) |
3ab2c837 BG |
45 | |
46 | (defcustom org-babel-lisp-dir-fmt | |
47 | "(let ((*default-pathname-defaults* #P%S)) %%s)" | |
48 | "Format string used to wrap code bodies to set the current directory. | |
49 | For example a value of \"(progn ;; %s\\n %%s)\" would ignore the | |
50 | current directory string." | |
acedf35c | 51 | :group 'org-babel |
372d7b21 | 52 | :version "24.1" |
acedf35c | 53 | :type 'string) |
afe98dfa CD |
54 | |
55 | (defun org-babel-expand-body:lisp (body params) | |
56 | "Expand BODY according to PARAMS, return the expanded body." | |
3ab2c837 BG |
57 | (let* ((vars (mapcar #'cdr (org-babel-get-header params :var))) |
58 | (result-params (cdr (assoc :result-params params))) | |
59 | (print-level nil) (print-length nil) | |
60 | (body (org-babel-trim | |
61 | (if (> (length vars) 0) | |
62 | (concat "(let (" | |
63 | (mapconcat | |
64 | (lambda (var) | |
65 | (format "(%S (quote %S))" (car var) (cdr var))) | |
66 | vars "\n ") | |
67 | ")\n" body ")") | |
68 | body)))) | |
69 | (if (or (member "code" result-params) | |
70 | (member "pp" result-params)) | |
71 | (format "(pprint %s)" body) | |
afe98dfa CD |
72 | body))) |
73 | ||
74 | (defun org-babel-execute:lisp (body params) | |
3ab2c837 | 75 | "Execute a block of Common Lisp code with Babel." |
acedf35c | 76 | (require 'slime) |
3ab2c837 BG |
77 | (org-babel-reassemble-table |
78 | ((lambda (result) | |
79 | (if (member "output" (cdr (assoc :result-params params))) | |
80 | (car result) | |
81 | (condition-case nil | |
e66ba1df | 82 | (read (org-babel-lisp-vector-to-list (cadr result))) |
3ab2c837 BG |
83 | (error (cadr result))))) |
84 | (with-temp-buffer | |
85 | (insert (org-babel-expand-body:lisp body params)) | |
86 | (slime-eval `(swank:eval-and-grab-output | |
87 | ,(let ((dir (if (assoc :dir params) | |
8223b1d2 BG |
88 | (cdr (assoc :dir params)) |
89 | default-directory))) | |
3ab2c837 BG |
90 | (format |
91 | (if dir (format org-babel-lisp-dir-fmt dir) "(progn %s)") | |
92 | (buffer-substring-no-properties | |
93 | (point-min) (point-max))))) | |
94 | (cdr (assoc :package params))))) | |
95 | (org-babel-pick-name (cdr (assoc :colname-names params)) | |
96 | (cdr (assoc :colnames params))) | |
97 | (org-babel-pick-name (cdr (assoc :rowname-names params)) | |
98 | (cdr (assoc :rownames params))))) | |
99 | ||
e66ba1df | 100 | (defun org-babel-lisp-vector-to-list (results) |
3ab2c837 BG |
101 | ;; TODO: better would be to replace #(...) with [...] |
102 | (replace-regexp-in-string "#(" "(" results)) | |
afe98dfa CD |
103 | |
104 | (provide 'ob-lisp) | |
105 | ||
5b409b39 | 106 | |
afe98dfa CD |
107 | |
108 | ;;; ob-lisp.el ends here |