功能指示符不受欢迎?

Bri*_*ins 5 lisp common-lisp quote

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

当然,#'foofoo通过flet等等定义时是必要的。我理解这一切的机制——我的问题是一种风格。难道只是因为人们不想考虑'foovs #'foo,所以他们使用后者是因为前者有时不起作用?即使是这样,它也不会解释使用,#'(lambda ...)因为#'在那里总是不必要的。

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

Mat*_*ard 5

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

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


Vse*_*kin 1

这是两个不同的风格决定,任何人都必须自己做出。我从未见过对这四种组合的任何批评。

\n\n

我个人更喜欢使用#\'而不是\',因为它使函数更加可见。我认为,这一点也不丑 \xe2\x80\x94 相反,我喜欢这种更明确的语法。不过,我很少会错过使用 Clojure 进行编程的情况。

\n\n

但我使用时lambda没有使用尖引号。关于这一点的很好的讨论可以在Let over Lambda中找到。我相信,最初的论点#\'(lambda...是肯特·皮特曼 (Kent Pitman)。

\n