在Lisp函数中对needle / haystack进行排序

时间:2015-04-07 18:01:58

标签: 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的指南,还是意外?

2 个答案:

答案 0 :(得分:4)

memberassoc等功能至少从1960年开始。

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

e ∈ m

由于Lisp使用前缀表示法,因此谓词/函数/运算符首先出现,元素为second,而set为第三:

(∈ e m)
约翰麦卡锡获得博士学位。在数学。

通常,在Common Lisp中,最后使用类似set的参数也是有用的:

(defun find-symbol (name package) ...)

Common Lisp中的实际定义是:

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

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

答案 1 :(得分:2)

让我们看看。 1960年的第一个McCarthy LISP有时将该列表作为第一个参数。见page 123 in this LISP manual。例如。

;; 1960 maplist
(defun maplist (list function)
  ...)

现在这也许是因为这个函数是最先生的高阶函数之一。实际上它早于第一个Lisp论文中的第一个实现。在第125页的相同手册中,您会找到sassoc,它今天看起来非常像assoc

(defun sassoc (needle haystack default-function)
  ...)

在下一个version 1.5 of the language中,这两个看起来都是一样的。 (有关maplist,请参阅第63页; sassoc

请参阅第60页

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

(defun  maplist (function &rest lists+)
  ...)

快速搜索CLHS中的常见参数名称"错误"订单给了我fillmap-intosort。可能会有更多。

Peter Norvigs style guide说要遵守惯例,但不是更详细。在阅读Scheme SRFI时,他们经常提到事实上的实现以及Common Lisp作为解决方案之前提出类似标准的东西。我在选择实施方法时也这样做。