Lisp函数中针/草堆的排序

Lisp函数中针/草堆的排序,lisp,common-lisp,Lisp,Common Lisp,在学习Lisp的过程中,我发现如果一个函数有两个参数,其中一个是单个元素或子集(指针),另一个是列表(haystack),那么元素或子集总是排在第一位 示例: (member 3 '(3 1 4 1 5)) (assoc 'jane '((jane doe) (john doe))) (subsetp '(a e) '(a e i o u)) 在我看来,在Lisp中似乎有一条规则,即函数应该遵循以下指导原则:第一部分,第二部分 这一发现实际上是基于Lisp中的指导

在学习Lisp的过程中,我发现如果一个函数有两个参数,其中一个是单个元素或子集(指针),另一个是列表(haystack),那么元素或子集总是排在第一位

示例:

(member 3 '(3 1 4 1 5))
(assoc 'jane '((jane doe)
               (john doe)))
(subsetp '(a e) '(a e i o u))
在我看来,在Lisp中似乎有一条规则,即函数应该遵循以下指导原则:第一部分,第二部分


这一发现实际上是基于Lisp中的指导原则,还是偶然的?

member
assoc
这样的函数至少是从1960年开始的

我只希望它遵循数学符号,例如在集合论中:

e ∈ m
由于Lisp使用前缀表示法,谓词/函数/运算符排在第一位,元素排在第二位,集合排在第三位:

(∈ e m)
约翰·麦卡锡拥有博士学位。在数学方面

通常,在Common Lisp中,最后设置类似参数也更有用:

(defun find-symbol (name package) ...)
Common Lisp中的实际定义是:

(defun find-symbol (name &optional (package *package*)) ...)

这允许我们使用当前包作为有用的默认值。

让我们看看。1960年的第一个麦卡锡口齿不清(McCarthy LISP)有时把这个列表作为第一个论点。看见例如

这可能是因为这个函数是最早的高阶函数之一。事实上,它早于第一个实现,正如它在第一篇Lisp论文中一样。在第125页的同一手册中,您可以找到
sassoc
,它看起来非常像今天的
assoc

(defun sassoc (needle haystack default-function)
  ...)
这两个在下一个场景中看起来都一样。(参见第63页查看
maplist
,参见第60页查看
sassoc

从这里到CommonLisp,有许多不同的路径可以再次连接。产生了很多新想法,但必须有理由打破兼容性才能真正做到这一点。我能想到一个原因,那就是支持多个列表。在公共Lisp
maplist
中:

(defun  maplist (function &rest lists+)
  ...)
在CLHS中快速搜索“错误”顺序的常见参数名称,我得到了,和。可能还有更多


彼得·诺维格斯(Peter Norvigs)说要遵循惯例,但没有比这更详细的了。在阅读Scheme SRFI时,他们通常会在建议类似于标准的内容之前,先提及实际实现以及Common Lisp作为解决方案的内容。在选择如何实施时,我也会这样做。

好的,有道理。还有更多的现代函数不遵循这种模式吗?maplist、mapcar有一个很好的理由首先使用它们的函数:随后是任意数量的列表。对于映射到,总是需要映射到结果序列,而可以有很多参数。这意味着它可能是(映射到result function.arglists)或(映射到function result.arglists)。@JoshuaTaylor我提到这可能就是他们(可能是MacLisp)破坏与LISP 1.5兼容的原因。我引用了“错”,因为我确信这个顺序是有原因的:-)是的,我看到你提到了为什么有多个参数的函数会把它们放在最后,但我是在评论,对于map-into和fill,同样的推理意味着它们不是真的“错”\
(defun  maplist (function &rest lists+)
  ...)