GNU bug report logs -
#27016
possible bug in `defsetf'
Previous Next
Reported by: Rafael D Sorkin <rsorkin <at> perimeterinstitute.ca>
Date: Mon, 22 May 2017 06:40:01 UTC
Severity: minor
Tags: fixed, patch
Found in versions 24.4, 25.2
Fixed in version 26.1
Done: npostavs <at> users.sourceforge.net
Bug is archived. No further changes may be made.
Full log
View this message in rfc822 format
Hello,
I wonder now if the definition of `eval-and-compile' as defmacro is
correct. Maybe Stefan can help (I CC'd him), he may also want to look
at the rest of the report...
npostavs <at> users.sourceforge.net writes:
> > #+begin_src emacs-lisp
> > (macroexpand '(defsetf foo bar))
> > ==>
> > '(lambda
> > (do &rest args)
> > (gv--defsetter 'foo
> > (lambda
> > (val &rest args)
> > `(,'bar ,@args ,val))
> > do args))
> > #+end_src
>
> I don't understand where that quote comes from.
The `defsetf' expands to an `eval-and-compile'. The `eval-and-compile'
expands to a quoted constant, see its definition (as defmacro).
> > When you compile a file with this content:
> >
> > #+begin_src emacs-lisp
> > (eval-and-compile
> > (unless nil
> > (defsetf foo bar)))
> > #+end_src
> >
> > you get an empty .elc.
> >
> > Isn't that strange?
>
> Yeah, even stranger...
AFAIU, when compiled, `eval-and-compile' macroexpands its body (see the
defconst of `byte-compile-initial-macro-environment'). So what is
compiled is essentially
#+begin_src emacs-lisp
(if nil nil
'(closure
(t)
(do &rest args)
(gv--defsetter 'foo
(lambda
(val &rest args)
`(,'bar ,@args ,val))
do args)))
#+end_src
and that's just discarded.
Michael.
This bug report was last modified 7 years and 290 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.