在lisp中,符号可以同时绑定到值和函数。 例如,
符号f绑定到函数
(defun f(x)
(* 2 x))
符号f绑定到值
(setq f 10)
所以我写这样的东西:
(f f)
=> 20
此功能有什么好处?
答案 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)
它对日常任务很有用,但主要原因是由于宏,你会理解为什么一旦你学习它。