[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Quoted function in `define-key'
From: |
Michael Heerdegen |
Subject: |
Re: Quoted function in `define-key' |
Date: |
Sun, 05 Feb 2017 14:50:36 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/26.0.50 (gnu/linux) |
Narendra Joshi <narendraj9@gmail.com> writes:
> So, the symbol `my-function' can have the function definition in its
> value slot?
There's a separate slot for function bindings. You can refer to it
directly with passing the symbol to `symbol-function'. So any symbol
can have two separate "bindings" - a binding as a variable, and one as a
function (unlike scheme, for example). That's why Elisp is a Lisp-2.
Actually, there is one more cell for symbol property lists ("plists").
See
(info "(elisp) Symbol Components")
for more details.
> What does the byte compiler do with this information? I am just
> curious about this.
When you sharp quote a lambda expression, the compiler knows that this
lambda list is supposed to be called as a function, and will byte
compile it. The evaluator might turn it into a closure when lexical
binding is used.
In elisp, the `lambda' macro comes with implicit function quoting (see
its definition), so you can just omit it.
But OTOH, it's an error to `quote' lambdas like
'(lambda () body...)
because it will prevent byte compilation or closure creation and make
Stefan angry.
Obviously for `function' quoted symbols there is not much to do, but the
byte compiler can determine whether that function is defined/ will be
defined at run time, so it can warn you about typos as an extra service.
For example, you get a compiler warning when compiling
(define-key my-map [key] #'make-frame-cmomand)
but not for
(define-key my-map [key] 'make-frame-cmomand)
> If this is recommended, I would also start quoting my functions as
> #'my-function.
Yes, it's a good idea.
Michael.
Re: Quoted function in `define-key', Stefan Monnier, 2017/02/04