GNU bug report logs -
#25154
25.1; Bindings in cl-letf are in reverse order
Previous Next
Reported by: Alex <agrambot <at> gmail.com>
Date: Fri, 9 Dec 2016 23:55:02 UTC
Severity: minor
Tags: notabug
Found in version 25.1
Done: Philipp Stephani <p.stephani2 <at> gmail.com>
Bug is archived. No further changes may be made.
Full log
View this message in rfc822 format
Eli Zaretskii <eliz <at> gnu.org> writes:
>> From: Alex <agrambot <at> gmail.com>
>> Cc: 25154 <at> debbugs.gnu.org
>> Date: Sat, 10 Dec 2016 12:05:40 -0600
>>
>> > Isn't it true that the order of evaluation in a 'let' is unspecified?
>> > If you want a particular order, use 'let*'.
>>
>> I don't think so. See (info "(elisp) Local Variables"):
>>
>> All of the VALUE-FORMs in BINDINGS are evaluated in the order they
>> appear
>
> That's the evaluation order.
Yes, which is what the (nreverse binds) in my patch actually affects,
despite the name of the variable being `binds'. This is why I said that
my choice of wording for this bug report was wrong, as it focused on a
less important problem.
As said in my last email, the expression:
(cl-letf (((aref v 1) 10)
((aref w 2) 20))
(aref v 1))
expands to:
(let*
((v v)
(v w)
(old
(aref v 2))
(old
(aref v 1)))
(unwind-protect
(progn
(aset v 2 20)
(aset v 1 10)
(aref v 1))
(aset v 2 old)
(aset v 1 old)))
which does indeed evaluate the arefs and asets in reverse order. This is
the most important part of my patch.
> Your code relies on the order of
> _binding_ variables to values, which is unspecified. Contrast the
> above with the description of 'let*' below it.
Just the (nreverse simplebinds) line, which I added just to make cl-letf
a little bit saner (i.e. more like let). This part does seem to be
unspecified, but I don't see why it should unnecessarily diverge from
let.
This bug report was last modified 8 years and 150 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.