この機能を実装しました。与えられた入力をチェックすることになっており、リストにある場合は「True」が画面に表示されます。ただし、数字に対してのみ機能し、文字を指定するとエラーが発生します。
(defun element (x lst)
(dolist (item lst)
(if (= item x) (return t))))
指定された文字も検索できるように変更するにはどうすればよいですか? 前もって感謝します。
この機能を実装しました。与えられた入力をチェックすることになっており、リストにある場合は「True」が画面に表示されます。ただし、数字に対してのみ機能し、文字を指定するとエラーが発生します。
(defun element (x lst)
(dolist (item lst)
(if (= item x) (return t))))
指定された文字も検索できるように変更するにはどうすればよいですか? 前もって感謝します。
#'= の代わりに #'eq を使用すると、3 行目が次のようになります。(if (eq item x) ...
または、組み込みの#'intersectionを使用して、指定された項目のいずれかがリストにあるかどうかを確認できます。したがって、次のようになります。(if (not (eq (intersection lst '(x)) nil)))
あなたが発見したように、=
関数は数字でのみ機能します。
代わりに関数をベースにしてみると、テストとしての関数のデフォルトの使用が、求める動作を提供するfind
ことがわかるでしょう。eql
(defun element (needle haystack)
(not (null (find needle haystack))))
の代わりに、その兄弟であるとfind
も研究する必要があります。あなたの場合、アイテムが見つかったかどうかを区別したいだけなので、最も機能の少ない関数を選択する必要があります。私の推測では、はここで負け、とは同等です。を抽出したリストを返しますが、 を返します。両方の関数で、 を抽出する必要があります。member
position
position
member
find
member
car
find
car
car
いくつかの比較演算子があります。一般的なものはeq
、eql
、equal
およびequalp
です。ハイパースペックで調べてください。
string=
特定のタイプのオブジェクトには、や などの特殊なコンパレータが存在することがよくありchar=
ます。
最後に、リスト操作については、 のような関数がありmember
、手動でループを記述する必要がなくなります。オプションのtest
パラメーターを使用して、比較関数を渡すことができます。