Lisp 什么';这是';和#';口齿不清?

Lisp 什么';这是';和#';口齿不清?,lisp,quote,Lisp,Quote,似乎两者都有 (mapcar 'car '((foo bar) (foo1 bar1))) 及 照样工作 我还知道'表示(引号符号)和#'表示(函数名) 但根本的区别是什么?为什么这两个都在先前的mapcar中工作 为什么这两个都在以前的mapcar中工作 文件说明: 如果函数是一个符号,则它被强制为一个函数,就好像是由 计算为符号FOO #'foo 计算为绑定到名称FOO的函数 在Lisp中,当符号FOO具有函数绑定时,可以将符号作为函数调用。在这里,汽车是一个具有功能绑定的符号 但这不

似乎两者都有

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

照样工作

我还知道
'
表示(引号符号)和
#'
表示(函数名)

但根本的区别是什么?为什么这两个都在先前的
mapcar
中工作

为什么这两个都在以前的mapcar中工作

文件说明:

如果函数是一个符号,则它被强制为一个函数,就好像是由

计算为符号FOO

#'foo
计算为绑定到名称FOO的函数

在Lisp中,当符号FOO具有函数绑定时,可以将符号作为函数调用。在这里,汽车是一个具有功能绑定的符号

但这不起作用:

(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 ...)
vs

后者可能会执行另一个间接寻址,因为它需要从符号中查找函数,而#'foo直接表示函数

摘要


如果符号具有函数绑定,则可以通过符号调用函数

尝试将匿名函数(lambda)传递给您的
mapcar
,您将看到
#“
是必需的,因为引号本身需要绑定到函数的符号,但未命名函数中不存在该符号:

CL-USER> (mapcar '(lambda (x) (format t "it is ~d" x)) (list 3 5 7))
; Evaluation aborted on #<TYPE-ERROR expected-type: (OR FUNCTION SYMBOL)
             datum: (LAMBDA (X) (FORMAT T "it is ~d" X))>.
(funcall #'foo ...)
(funcall 'foo ...)
CL-USER> (mapcar '(lambda (x) (format t "it is ~d" x)) (list 3 5 7))
; Evaluation aborted on #<TYPE-ERROR expected-type: (OR FUNCTION SYMBOL)
             datum: (LAMBDA (X) (FORMAT T "it is ~d" X))>.
CL-USER> (mapcar #'(lambda (x) (format t "it is ~d" x)) (list 3 5 7))
it is 3it is 5it is 7
(NIL NIL NIL)