Unlike Scheme, Emacs Lisp is a 2-lisp, which means that each symbol has two separate bindings: the value binding and the function binding. In a function call (a b c d)
, the first symbol (a
) is looked up using a function binding, the rest (b c d
) are looked up using the value binding. Special form let
creates a new (local) value binding, flet
creates a new function binding.
Note that whether value or function binding is used for lookup depends on the position in the (a b c d)
function call, not on the type of the looked-up value. In particular, a value binding can resolve to function.
In your first example, you function-bind f
(via flet
), and then do a function lookup:
(f ...)
In your second example, you value-bind f
to a function (via let
), and then use a value lookup:
(... f ...)
Both work because you use the same kind of binding and lookup in each case.
http://en.wikipedia.org/wiki/Common_Lisp#Comparison_with_other_Lisps
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…