和 之间有什么区别?和#'在 Lisp 中?
两者看起来
(mapcar 'car '((foo bar) (foo1 bar1)))
和
(mapcar #'car '((foo bar) (foo1 bar1)))
工作原理都是一样的。
我还知道 '
表示(引号符号),#'
表示(函数函数名称)。
但根本的区别是什么?为什么这两个在之前的mapcar
中都可以工作?
It seems both
(mapcar 'car '((foo bar) (foo1 bar1)))
and
(mapcar #'car '((foo bar) (foo1 bar1)))
work as the same.
And I also know '
means (quote symbol) and #'
means (function function-name).
But what's the underlying difference? Why these 2 both work in previous mapcar
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
计算结果为符号 FOO。
计算结果为绑定到名称 FOO 的函数。
在 Lisp 中,当符号 FOO 具有函数绑定时,可以将符号作为函数调用。这里 CAR 是一个具有函数绑定的符号。
但这不起作用:
这是因为 FOO 作为符号无法访问本地词法函数,并且当
foo
不是其他地方定义的函数时,Lisp 系统会抱怨。我们需要这样写:
这里的 (function foo) 或其简写符号 #'foo 指的是词法局部函数 FOO。
另请注意,在
vs
中,后者可能会多做一次间接寻址,因为它需要从符号中查找函数,而 #'foo 直接表示函数。
总结:
如果符号具有函数绑定,则可以通过符号调用函数。
evaluates to the symbol FOO.
evaluates to the function bound to the name FOO.
In Lisp a symbol can be called as a function when the symbol FOO has a function binding. Here CAR is a symbol that has a function binding.
But this does not work:
That's because FOO as a symbol does not access the local lexical function and the Lisp system will complain when
foo
is not a function defined elsewhere.We need to write:
Here the (function foo) or its shorthand notation #'foo refers to the lexical local function FOO.
Note also that in
vs.
The later might do one more indirection, since it needs to lookup the function from the symbol, while #'foo denotes the function directly.
Summary:
If a symbol has a function binding, calling a function through the symbol works.
mapcar 的文档说:
The documentation for mapcar says:
尝试将匿名函数 (lambda) 传递给您的
mapcar
,您会发现#'
是必需的,因为引用本身需要一个绑定到函数的符号,但该符号不存在于未命名的函数中:vs:
Try passing an anonymous function (lambda) to your
mapcar
and you'll see that#'
is required since the quote by itself expects a symbol that is bound to a function, but the symbol doesn't exist in an un-named function:vs: