如果您希望它以一般方式工作,您应该将比较函数作为参数传递:
(defun member-of-sorted (item list
&key (test #'=) (end-test #'<) (key #'identity))
(loop :for tail :on list
:for element := (funcall key (first tail))
:until (funcall end-test item element)
:when (funcall test item element)
:do (return-from member-of-sorted tail))
nil)
我试图使它尽可能与标准相似member
。如果您不想在数字上而是在其他事物上使用它,请传递适当的:test
和:end-test
参数。如果您在同一个使用地点有不同的类型,您可以围绕它包装一个类型表格。
编辑:我应该添加使用示例:
(member-of-sorted 3 '(1 2 3 4 5 6))
=> (3 4 5 6)
(member-of-sorted 3/2 '(1 2 3 4 5 6))
=> NIL
(member-of-sorted "foo" '("bar" "baz" "foo" "quux")
:test #'string=
:end-test #'string<)
=> ("foo" "quux")
(member-of-sorted #\D '(#\A #\C #\E #\S)
:test #'char=
:end-test #'char<)
=> NIL
(member-of-sorted #\D '(#\A #\C #\D #\E #\S)
:test #'char=
:end-test #'char<)
=> (#\D #\E #\S)