No, it shouldn't, if you use dynamic binding. Here are two choices (alternatives) that can help:
- Use lexical binding. Set variable
lexical-binding
for the file.
- Use dynamic binding (what you are doing now, no doubt), but also substitute the value of the variable
cmd
for the variable cmd
in the lambda
body. You can do this only if the function body of the lambda
does not actually need cmd
to be a variable when it is invoked and can get by with just its value (its value at the time the function is added to the hook).
For #1, see node
Using Lexical Binding
in the Elisp manual. Essentially, you'll have to add -*- lexical-binding: t; -*-
to the end of the first line of the file.
For #2, you do this:
(add-hook mode-hook `(lambda () (set (make-local-variable 'compile-command) ',cmd))))
For information about this, see node Backquote
in the Elisp manual.
In the case of #2, what is added to the hook is a textual lambda
expression. It is interpreted (and so invoked) as a function only when the hook is run.
In the case of #1, the function (a closure, actually) corresponding to the lambda
expression is interpreted as (understood to be) a function when it is added to the hook, and it can thus even be byte-compiled.
The closure contains a variable binding of cmd
to the value it had when the function was added to the hook), as part of the function code (compiled or not).
This means that when that function is invoked any code that it runs has access to cmd
as a variable at that time (not just a value). If you don't really need a variable cmd
at that time and a value will do, and if you don't care about byte-compiling the lambda
code, then #1 is typically adequate.