ob-emacs-lisp: Make lexical eval default for elisp src blocks

* lisp/ob-emacs-lisp.el (org-babel-header-args:emacs-lisp):
(org-babel-default-header-args:emacs-lisp): New variables.
(org-babel-execute:emacs-lisp): Add an optional argument to the eval
function.
This commit is contained in:
John Kitchin 2016-04-18 13:55:34 -04:00 committed by Nicolas Goaziou
parent b2411769cf
commit 516bbf417c
2 changed files with 33 additions and 9 deletions

View File

@ -467,6 +467,17 @@ docstring for more information.
- ~org-latex-format-inlinetask-function~
- ~org-link-search~
** New features
*** Default lexical evaluation of emacs-lisp src blocks
Emacs-lisp src blocks in babel are now evaluated using lexical scoping. There is a new header to control this behavior.
The default results in an eval with lexical scoping.
:lexical yes
This turns lexical scoping off in the eval (the former behavior).
:lexical no
This uses the lexical environment with x=42 in the eval.
:lexical '((x . 42))
*** Behavior of ~org-return~ changed

View File

@ -28,8 +28,16 @@
;;; Code:
(require 'ob)
(defvar org-babel-default-header-args:emacs-lisp nil
"Default arguments for evaluating an emacs-lisp source block.")
(defconst org-babel-header-args:emacs-lisp '((lexical . :any))
"Emacs-lisp specific header arguments.")
(defvar org-babel-default-header-args:emacs-lisp '((:lexical . "yes"))
"Default arguments for evaluating an emacs-lisp source block.
:lexical is \"yes\" by default and causes src blocks to be eval'd
using lexical scoping. It can also be an alist mapping symbols to
their value. It is used as the optional LEXICAL argument to
`eval', which see.")
(defun org-babel-expand-body:emacs-lisp (body params)
"Expand BODY according to PARAMS, return the expanded body."
@ -51,13 +59,18 @@
(defun org-babel-execute:emacs-lisp (body params)
"Execute a block of emacs-lisp code with Babel."
(save-window-excursion
(let ((result
(eval (read (format (if (member "output"
(cdr (assoc :result-params params)))
"(with-output-to-string %s)"
"(progn %s)")
(org-babel-expand-body:emacs-lisp
body params))))))
(let* ((lexical (cdr (assq :lexical params)))
(result
(eval (read (format (if (member "output"
(cdr (assq :result-params params)))
"(with-output-to-string %s)"
"(progn %s)")
(org-babel-expand-body:emacs-lisp
body params)))
(if (listp lexical)
lexical
(member lexical '("yes" "t"))))))
(org-babel-result-cond (cdr (assoc :result-params params))
(let ((print-level nil)
(print-length nil))