6

浏览 Common Lisp 源代码,我注意到人们最常使用#'foowhere'foo就足够了——也就是说,只要函数指示符被接受,他们就会选择传递函数。

当然#'foo是必须的 whenfoo是 viaflet等定义的。我了解这一切的机制——我的问题是风格之一。是否只是因为人们不想考虑'foovs #'foo,所以他们使用后者,因为前者有时不起作用?即使是这样,它也不能解释#'(lambda ...)因为#'在那里总是不必要的使用。

CL 有时因为 而被称为丑陋的#',大多数新手都没有意识到(我敢说)大多数情况下它是不必要的。我不是新人,但我碰巧更喜欢'foo. 为什么我不寻常?如果我发布了一些给funcalland符号的代码,apply我会被嘲笑和羞辱吗?我正在考虑在我所在的地区开设一个匿名功能指示符章节。我怀疑人们想使用功能指示符,但由于同侪压力,不敢“公开”。

4

3 回答 3

6

使用#'在概念上更简单:无论您是在处理匿名函数、通过调用获得的compile函数还是使用#'引用的函数,您总是在引用一个函数对象。鉴于此,将符号传递给maporfuncall是一种奇怪的特殊情况,它根本不像传递函数对象那么直观。

但是,在某些情况下,可以说符号在概念上更合适,例如在:test参数的情况下make-hash-table。在这种情况下,您从键比较函数名称指定的四种不同类型的哈希表中选择一种。在这种情况下,我更喜欢符号,因为使用函数对象来区分一种哈希表和另一种是没有意义的。(这也是一种误导,因为它往往会欺骗您相信您可以将任意等价谓词传递给make-hash-table.)

于 2011-10-10T19:21:13.070 回答
3

他们不一样。 'foo是对任何碰巧是foo函数的全局定义的引用,并且是旧时代的遗留物,当时范围非常混乱。

CL-USER(1): (defun foo (x) 1)
FOO
CL-USER(2): (flet ((foo (x) 2)) (mapcar #'foo '(1 2 3)))
(2 2 2)
CL-USER(3): (flet ((foo (x) 2)) (mapcar 'foo '(1 2 3)))
(1 1 1)
于 2011-10-09T20:37:55.060 回答
1

Those are 2 separate style decisions, that anyone has to make for himself. I've never seen any criticism of any of the four combinations.

Personally I prefer to use #' instead of ', because it makes functions more visible. I think, this isn't ugly at all — on the contrary, I like this more explicit syntax. Although, programming in Clojure, I only rarely miss it.

Yet I use lambda without sharp-quote. A good discussion of this can be found in Let over Lambda. And the original argument for #'(lambda... goes to Kent Pitman, I believe.

于 2011-10-09T20:14:53.977 回答