在学习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的指南,还是意外?
答案 0 :(得分:4)
member
和assoc
等功能至少从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
从这里到Common Lisp,有不同的路径再次连接。出现了很多新的想法,但必须有理由打破兼容性才能真正做到这一点。我可以想到一个原因,那就是支持多个列表。在Common Lisp中maplist
是:
(defun maplist (function &rest lists+)
...)
快速搜索CLHS中的常见参数名称"错误"订单给了我fill
,map-into
和sort
。可能会有更多。
Peter Norvigs style guide说要遵守惯例,但不是更详细。在阅读Scheme SRFI时,他们经常提到事实上的实现以及Common Lisp作为解决方案之前提出类似标准的东西。我在选择实施方法时也这样做。