Re: Where is the source of LET* macro
Shannon Spires <[email protected]> Fri, 14 Apr 2023 15:33:28 -0600
| Newsgroups | gmane.lisp.openmcl.devel |
|---|---|
| Message-ID | <[email protected]> |
Tim's example is very interesting. Let's look at two forms seem like they should do the same thing, i.e. just funcall the c value. FORM A: (funcall (let (c) (let* ((x 1) (x (progn (setf c (lambda () x)) 2))) (declare (special x)) (values c (lambda () x))))) FORM B: (funcall (let (c) (let ((x 1)) (let ((x (progn (setf c (lambda () x)) 2))) (declare (special x)) (values c (lambda () x)))))) Form B is just Form A reexpressed as nested lets rather than a single let*. What's interesting is that CCL and Lispworks throw an error (unbound variable x) on Form A but return 1 on Form B. SBCL returns 1 on both, without any error. I don't know which implementation should be considered "correct." -SS On 4/14/23 3:01 PM, Tim Bradshaw wrote: > I think this is surprisingly underspecified. I think the only sane answer is that declarations should apply to all the bindings of a given name in a given let* (or other sequential-binding) form. > > It is possible to check this : > > (let (c) > (let ((x 1) > (x (progn (setf c (lambda () x)) 2)) > (declare (special x)) > (values c (lambda () x)))) > > (sorry for paren/indentation errors, I'm typing this on a phone). If the special declaration applies to both bindings then calling either function returned will be an error. If it applies to only one: which, and why, and why does nothing say? Either the spec simply omits this crucial information which would be a horrible omission, or the declarations apply to all the bindings. Or, quite possibly I've just missed the place where it *does* say... > > --tim > >> On 14 Apr 2023, at 21:17, Arthur Cater <[email protected]> wrote: >> >> I can only find a define-compiler-macro, I want to see how LET* handle declarations. >> It surprises me that it is apparently legal to say >> >> ? (let* ((it 7) (it (list it it)) (it (length it))) it) >> 2 >> ? >> >> and I wondered how declarations (if present) are treated - but I can’t find the source code. >> >> TIA for any hep