help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

lexical-let detail semantics


From: Daniel Kraft
Subject: lexical-let detail semantics
Date: Mon, 27 Jul 2009 11:50:15 +0200
User-agent: Thunderbird 2.0.0.0 (X11/20070425)

Hi,

I'm working on an implementation of elisp for GNU Guile, and want to include the lexical-let construct from the Common Lisp Extensions of elisp. There are some details of its semantics I'm not sure about and that are not clarified in the documentation of lexical-let, so I had to do some experiments. Here are two questions that came up during these where I'd love to hear comments from regular elisp users:


1) let within lexical-let:

(setq a 1)
(defun dyna () a)
(lexical-let ((a 2))
  (let ((a 3))
    (print (dyna))))
  => 1

My first thought was that a let within the lexical scope of another lexical-let would revert the symbols to dynamic scoping again, but it seems that let behaves just as if it was lexical-let for symbols already lexically bound.

Is this 'expected behaviour' or something 'by chance'? Do you think it is necessary for compatibility with (most) existing code to mimic this behaviour or would it be ok for the code above to print 3?

In contrast, the code:

(setq a 1)
(defun dyna () a)
(lexical-let ((a 2))
  ((lambda (a)
     (print (dyna))) 3))
  => 3

does indeed revert a to dynamic binding... This seems somewhat inconsistent to me (although of course argument-lists and let's are not really the same thing).


2) Closures:

I'm happy that lexical-let works well to build closures (and in fact it seems that this is the main intention for lexical-let at all); however this code does not work as expected:

(setq a 1)
(lexical-let ((a 2))
  ((lambda () (print a))))
  => 1

I don't know why, but it seems that calling a closure directly fails, while storing it and calling it later succeeds (as in the examples at http://www.delorie.com/gnu/docs/emacs/cl_21.html for instance). Is this a bug or again something expected? If the latter, what's the exact rationale and semantics then?

Thank you very much for your help!
Daniel





reply via email to

[Prev in Thread] Current Thread [Next in Thread]