[developers] dot.emacs redefinition of 'unless' and 'when'

Dan Flickinger danf at stanford.edu
Wed Dec 20 11:04:46 CET 2017


HI Mike,


I can't tell you why LOGON redefines those two macros, but note that you can see what the macro is doing by asking Emacs to evaluate for example the following:

(macroexpand '(unless t t))

which in the LOGON universe shows you

(or t (progn t))

which returns T, confirming that here you get the value of the first argument to `unless if it is non-nil, and the value of the final argument otherwise.

In contrast, in unmodified Emacs, the macroexpand shows you

(if t nil t)

confirming that you get NIL if the first argument is non-nil, and the value of the final argument otherwise.


As for usage, I looked at the three files in the LOGON repository with suffix ".el", and reckon that the pg-interface.el file is not used by anyone but me (for the lexical database).  Of the other two, lkb.el only calls 'unless once, with no interest in the returned value, and tdl-mode.el makes just one call to `when, and it looks like it might matter what is returned (to set the value of 'indent-me).


So my impression is that there is no need to preserve the LOGON redefinition of 'unless, and perhaps the effect of the redefined 'when could be managed differently in the one call in tdl-mode.el without redefining the macro.


 Dan





________________________________
From: developers-bounces at emmtee.net <developers-bounces at emmtee.net> on behalf of Michael Wayne Goodman <goodmami at uw.edu>
Sent: Tuesday, December 19, 2017 1:49 PM
To: developers
Subject: Re: [developers] dot.emacs redefinition of 'unless' and 'when'

Sorry, one more change to my original mail. I mistakenly assumed that 'unless' was not returning the last value when the condition was false (based on some symptoms I was seeing), but I didn't explicitly test this, and my lisp is not good enough to deduce this by looking at the defmacro expression in ${LOGONROOT]/dot.emacs. In fact, it *does* appear to return the last value, but the difference from the default definition is that LOGON-unless returns the value of the condition when it's non-nil, rather than returning nil.

; standard unless
(unless nil 1 2 3)  ; returns: 3
(unless 'value 1 2 3)  ; returns: nil

; LOGON unless
(unless nil 1 2 3)  ; returns: 3
(unless 'value 1 2 3)  ; returns: value

So when LOGON-unless is used in constructing a list, it will (I think) append the value of the condition to the list instead of nothing.


On Tue, Dec 19, 2017 at 10:18 AM, Michael Wayne Goodman <goodmami at uw.edu<mailto:goodmami at uw.edu>> wrote:
On Tue, Dec 19, 2017 at 8:12 AM, Michael Wayne Goodman <goodmami at uw.edu<mailto:goodmami at uw.edu>> wrote:
Hi Developers,

Does anyone know why ${LOGONROOT}/dot.emacs redefines the 'unless' and 'when' macros? It breaks some other Emacs packages I have that depend on the return value of the 'unless', which should be the value of the last argument. I'm aware that 'unless' and 'when' should be used when the return value is *not* important (according to https://www.emacswiki.org/emacs/WhenToUseIf), but do we have to enforce that suggestion by redefining the macros so they don't return the last value?

Also see https://www.gnu.org/software/emacs/manual/html_node/elisp/Conditionals.html, which says that 'unless' is equivalent to:

    (if condition nil
       a b c)

Er... I meant that the guide says `(unless condition a b c)' is equivalent to the above, not in the general case. And I think the expected return value of the 'unless' expression would be c if condition returns nil.

Thanks

--
Michael Wayne Goodman
Ph.D. Candidate, UW Linguistics



--
Michael Wayne Goodman
Ph.D. Candidate, UW Linguistics



--
Michael Wayne Goodman
Ph.D. Candidate, UW Linguistics
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.delph-in.net/archives/developers/attachments/20171220/611d7bec/attachment.html>


More information about the developers mailing list