<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">You might want to take a look at my BINDING-BLOCK macro which combines LET/LET*, MULTIPLE-VALUE-BIND, DESTRUCTURING-BIND, FLET/LABELS, and more (it's user-extensible).<div class=""><br class=""></div><div class=""><a href="https://github.com/rongarret/ergolib/blob/master/core/binding-block.lisp" class="">https://github.com/rongarret/ergolib/blob/master/core/binding-block.lisp</a></div><div class=""><br class=""></div><div class="">rg<br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Apr 14, 2023, at 4:53 PM, Arthur Cater <<a href="mailto:arthur.cater@ucd.ie" class="">arthur.cater@ucd.ie</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="">Oh dear oh dear. I’m sorry I’ve opened a can of worms. I must apologise as I wasn’t looking at the spec, but at CLtL2 which clearly says LET* is a macro.<br class=""><br class="">Personally, I’d never write the code I gave as an example. I totally agree with Shannon, it’s ugly. The reason I asked is because I thought it’d be handy to write a new macro for my own use, and offer it to others, provisionally called LET**. The doc string says<br class=""><br class="">LET** provides a syntax for easily combining functionality of LET* and MULTIPLE-VALUE-BIND.<br class="">Anything you can say to LET* you can say to LET**, the converse is not true.<br class="">…...<br class=""><br class=""><br class="">So I wanted to make it true that "Anything you can say to LET* you can say to LET**", and this involves handling declarations the same way, and that involves understanding how LET* handles declarations, and that led to asking myself whether it was possible to bind the same name multiple times - thinking I understood LET* expanded into multiple nested LETs. CLtL2 didn’t say yea or nay, so I experimented and CCL said yea. What’s it doing then? What does it expand to? Let’s look at the macro expansion. What, it expands to itself??? Ask my openmcl friends.<br class=""><br class="">And it looks like it’s a can of worms. Just yesterday I was amused to see in somebody’s blog a snapshot of the CLtL2 index  “kludges, 1-971”. <br class=""><br class=""><br class=""><br class=""><blockquote type="cite" class="">On 14 Apr 2023, at 22:01, Tim Bradshaw <<a href="mailto:tfb@tfeb.org" class="">tfb@tfeb.org</a>> wrote:<br class=""><br class="">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.<br class=""><br class="">It is possible to check this :<br class=""><br class="">(let (c)<br class=""> (let ((x 1)<br class="">       (x (progn (setf c (lambda () x)) 2))<br class="">   (declare (special x))<br class="">   (values c (lambda () x))))<br class=""><br class="">(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...<br class=""><br class="">--tim<br class=""><br class=""><blockquote type="cite" class="">On 14 Apr 2023, at 21:17, Arthur Cater <<a href="mailto:arthur.cater@ucd.ie" class="">arthur.cater@ucd.ie</a>> wrote:<br class=""><br class="">I can only find a define-compiler-macro, I want to see how LET* handle declarations.<br class="">It surprises me that it is apparently legal to say<br class=""><br class="">? (let* ((it 7) (it (list it it)) (it (length it))) it)<br class="">2<br class="">? <br class=""><br class="">and I wondered how declarations (if present) are treated - but I can’t find the source code.<br class=""><br class="">TIA for any hep<br class=""></blockquote></blockquote><br class=""></div></div></blockquote></div><br class=""></div></body></html>