如果您希望以一般方式工作,您應該通過比較函數作爲參數:
(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)
是'*每種不超過*'一個變量,保存了一個函數對象? –
比較之前,比較整數作爲字符串只是'prin1-to-string'。所以你可以做'(mapcar#'prin1-to-string list)',這將有效地將它強制轉換爲一個字符串列表。 –
由於@wvxvw逗號實際上是一個類型0我改變了它。 – user1011346