Lisp中的’和#’有什么区别?

好像都是

(mapcar 'car '((foo bar) (foo1 bar1)))

(mapcar #'car '((foo bar) (foo1 bar1)))

工作一样.

而且我也知道’means(quote symbol)和#’表示(function function-name).

但是什么是根本的区别呢?为什么这2个都在以前的mapcar工作?

'foo

评估为符号FOO.

#'foo

评估到绑定到名称FOO的函数.

在Lisp中,当符号FOO具有函数绑定时,可以将符号称为函数.这里CAR是具有函数绑定的符号.

但这不行:

(flet ((foo (a) (+ a 42)))
  (mapcar 'foo '(1 2 3 4 5)))

这是因为作为符号的FOO不会访问本地词法函数,而当foo不是其他地方定义的函数时,Lisp系统会抱怨.

我们需要写:

(flet ((foo (a) (+ a 42)))
  (mapcar #'foo '(1 2 3 4 5)))

这里的(函数foo)或者它的简写符号#’foo是指词法本地函数FOO.

还要注意

(funcall #'foo ...)

(funcall 'foo ...)

后者可能会再做一个间接,因为它需要从符号中查找函数,而#’foo直接表示函数.

概要:

如果一个符号有一个函数绑定,通过符号工作调用一个函数.

相关文章
相关标签/搜索