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

时间:2010-11-13 09:38:10

标签: namespaces lisp

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

符号f绑定到函数

(defun f(x)
    (* 2 x))

符号f绑定到值

(setq f 10)

所以我写这样的东西:

(f f)

=> 20

此功能有什么好处?

2 个答案:

答案 0 :(得分:12)

符号既可以包含函数,也可以包含值。可以使用SYMBOL-FUNCTION检索该函数,使用SYMBOL-VALUE检索该函数。

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

那么有什么好处:

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

    Scheme :( define(foo lst)(list lst))

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

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

    Scheme :( define(foo)(bar))

    CL :( defun foo()(bar))

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

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

答案 1 :(得分:-1)

它对日常任务很有用,但主要原因是由于宏,你会理解为什么一旦你学习它。