Thanks for the feedback. I have a few questions below. On Mon, Apr 18, 2016 at 12:38 PM, Nicolas Goaziou wrote: > Hello, > > John Kitchin writes: > > > Set default in `org-babel-default-header-args:emacs-lisp'. Add an > > optional argument to the eval function. > > Thanks for the patch. Some comments follow. > > > +*** 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)) > > According to the Elisp manual: > > The value of LEXICAL can also be a non-empty alist specifying > a particular "lexical environment" for lexical bindings; however, > this feature is only useful for specialized purposes, such as in > Emacs Lisp debuggers. *Note Lexical Binding::. > > I'm not opposed to it, but is there any reason to include the > opportunity to specify an alist here? > I just put it in because it is an option for the eval function, and it was not difficult to implement. It might be useful for debugging. > > > +(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'.") > > You need to separate sentences with two spaces. > no problem. > > You also need to add (defconst org-babel-header-args:emacs-lisp). See > for example `org-babel-header-args:R'. > Are you suggesting use defconst instead of defvar? Does it really need all the things in org-babel-header-args:R? Or just the required default for lexical? > > > (defun org-babel-expand-body:emacs-lisp (body params) > > "Expand BODY according to PARAMS, return the expanded body." > > @@ -51,13 +57,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 (assoc :lexical params))) > > Nitpick: (cdr (assq :lexical params)) > no problem. > > > + (result > > + (eval (read (format (if (member "output" > > + (cdr (assoc :result-params > params))) > > Nitpick, while you're at it: (cdr (assq :result-params params)) > no problem. Should all the assocs be replaced by assq, or just these ones? > > > + "(with-output-to-string %s)" > > + "(progn %s)") > > + (org-babel-expand-body:emacs-lisp > > + body params))) > > + > > + (if (listp lexical) > > + lexical > > + (string= "yes" lexical))))) > > There is no support for t. I think we should allow both :lexical > t and :lexical yes. > something like (member lexical '("yes" "t"))? > > > Regards, > > -- > Nicolas Goaziou >