これを一般的な方法で機能させたい場合は、比較関数をパラメーターとして渡す必要があります。
(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)