符号同时绑定到值和函数的优点是什么?

Var*_*jan 5 lisp namespaces

在lisp中,符号可以同时绑定到值和函数.例如,

符号f绑定到一个函数

(defun f(x)
    (* 2 x))
Run Code Online (Sandbox Code Playgroud)

符号f绑定到一个值

(setq f 10)
Run Code Online (Sandbox Code Playgroud)

所以我写这样的东西:

(f f)
Run Code Online (Sandbox Code Playgroud)

=> 20

这样的功能有什么好处?

Rai*_*wig 11

符号可以同时具有函数和值.可以使用SYMBOL-FUNCTION检索该函数,使用SYMBOL-VALUE检索该值.

这不是完整的视图.Common Lisp(至少)有两个名称空间,一个用于函数,一个用于变量.全球符号参与其中.但对于本地功能,不涉及符号.

那么有什么好处:

  • 函数和变量的标识符之间没有名称冲突.

    方案:( define(foo lst)(list lst))

    CL :( defun foo(list)(列表清单))

  • 没有运行时检查某些东西是否真的是一个函数

    方案:( define(foo)(bar))

    CL :( defun foo()(bar))

    在Scheme中,不清楚BAR是什么.它可能是一个数字,在调用FOO时会导致运行时错误.

    在CL BAR中是函数或未定义.它永远不会是别的.它可以例如永远不是数字.无法将函数名称绑定到数字,因此无需在运行时检查此情况.