1

この機能を実装しました。与えられた入力をチェックすることになっており、リストにある場合は「True」が画面に表示されます。ただし、数字に対してのみ機能し、文字を指定するとエラーが発生します。

(defun element (x lst)
  (dolist (item lst) 
    (if (= item x) (return t))))

指定された文字も検索できるように変更するにはどうすればよいですか? 前もって感謝します。

4

3 に答える 3

1

#'= の代わりに #'eq を使用すると、3 行目が次のようになります。(if (eq item x) ...

または、組み込みの#'intersectionを使用して、指定された項目のいずれかがリストにあるかどうかを確認できます。したがって、次のようになります。(if (not (eq (intersection lst '(x)) nil)))

于 2012-07-16T20:22:05.600 に答える
1

あなたが発見したように=関数は数字でのみ機能します。

代わりに関数をベースにしてみると、テストとして関数のデフォルトの使用が、求める動作を提供するfindことがわかるでしょう。eql

(defun element (needle haystack)
  (not (null (find needle haystack))))

の代わりに、その兄弟であるとfindも研究する必要があります。あなたの場合、アイテムが見つかったかどうかを区別したいだけなので、最も機能の少ない関数を選択する必要があります。私の推測では、はここで負け、とは同等です。を抽出したリストを返しますが、 を返します。両方の関数で、 を抽出する必要があります。memberpositionpositionmemberfindmembercarfindcarcar

于 2012-07-16T20:23:15.333 に答える
1

いくつかの比較演算子があります。一般的なものはeqeqlequalおよびequalpです。ハイパースペックで調べてください。

string=特定のタイプのオブジェクトには、や などの特殊なコンパレータが存在することがよくありchar=ます。

最後に、リスト操作については、 のような関数がありmember、手動でループを記述する必要がなくなります。オプションのtestパラメーターを使用して、比較関数を渡すことができます。

于 2012-07-16T20:26:34.287 に答える