emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: eval-when-compile


From: Achim Gratz
Subject: Re: eval-when-compile
Date: Fri, 27 Jul 2012 19:50:58 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.1 (gnu/linux)

Pascal J. Bourguignon writes:
> C-h f eval-when-compile RET
>
>     Like `progn', but evaluates the body at compile time if you're compiling.
>     Thus, the result of the body appears to the compiler as a quoted constant.
>     In interpreted code, this is entirely equivalent to `progn'.
>
> What more can I add?

I read that.  It doesn't seem to work that way or has some strings
attached that aren't obvious to me from the documentation.

> The above source will evaluate, when you compile the file:
>
>     (defvar unquoted-t "true")
>     '(defvar quoted-nil "false")

No.  They will evaluate to

unquoted-t
(defvar quoted-nil "false")

The unquoted variant was only there to check if maybe there's another
`(quote …)´ snuck in.  I expected the defvar form to compile, but it
doesn't.

> When you load the file, it won't evaluate anything.

Actually they will evaluate to the very same thing, per the definition
of eval-when-compile.  It's easy enough to see that this part is working
as advertised.

> Here, you're defining a macro at compilation time.  When compiling this
> file, the macro is known and (ewc-macro) expands to (defvar macro-nil
> "false") so that's compiled into the elc file, and that's the only thing
> that's loaded.

Yes, that is working as expected, however I don't like the clutter that
it produces.

> If you try to load the .el file directly, then the macro is not defined,
> and you're trying to call a function named (ewc-macro) which will fail.

Again, the macro will be defined at load time and expanded from the
`(ewc-macro)´ form.  There'd be a lot of broken code in Emacs if that
wasn't working.

> Now indeed, if you have decisions to make at compilation time, you need
> to define variables and functions at compilation time to compute those
> decisions.

What I'm actually trying to do is providing compatibility definitions
for other versions of Emacs.  That works fine as long as I only need to
compute different values at compile time (as documented in the manual).
It doesn't work when I can do a `(defalias …)´ for one version of Emacs,
but need a `(defun …)´ for another.  It can all be solved one way or the
other by adding macros to the mix, but my question still hasn't been
answered: why does it not work with eval-when-compile?


Regards,
Achim.
-- 
+<[Q+ Matrix-12 WAVE#46+305 Neuron microQkb Andromeda XTk Blofeld]>+

SD adaptation for Waldorf Blofeld V1.15B11:
http://Synth.Stromeko.net/Downloads.html#WaldorfSDada




reply via email to

[Prev in Thread] Current Thread [Next in Thread]