2

Common Lisp を学び始めたばかりで、読んでいるテキストでは関数の例を使用していmemberます。

これら 2 つのコード ブロックの違いがよくわかりません。

(if (member nil '(1 nil 2 3))
    'contains-nil
    'does-not-contain-nil)

CONTAINS_NIL を返します

(if (member nil '(1 2 3))
    'contains-nil
    'does-not-contain-nil)

DOES-NOT-CONTAIN-NIL を返します

私が理解していることから、リストはネストされたセルと同等であるため、を返すconsと思いますが、 を返すだけです。コンパイラーやインタープリターがその区別をどのように行うかはわかりません。関数を実装する方法について誰かが私に洞察を与えることができれば、感謝します。(member nil (cons 1 (cons 2 (cons 3 nil)))(nil)nilmember

4

4 に答える 4

2

MEMBERリスト自体ではなく、リストの要素のみを調べます。空のリストは、要素として別の空のリストを持つ空のリストとは異なります。

()と同じではありません(())()と同じではありません(nil)

リストはコンス セルで構成されているため、要素はcarsコンス セルの です。

于 2013-05-22T07:35:12.420 に答える
1

リストは、空のリスト NIL であるか、CAR がリストの要素であり、CDR が別のリストであるコンス セルであると定義されます。によって生成されたリスト

(cons 1 nil)

要素 1 と空のリストのすべての要素を持つリストです。空のリストには要素がないため、NIL はリストの要素ではありません。セットの場合も同様です。空のセットは任意のセットのサブセットですが、すべてのセットの要素ではありません (通常、セットの要素であることは禁止されていません)。

MEMBER を実装する 1 つの方法は次のとおりです。

(defun member (item list)
  (if list
      (if (eql item (car list))
          list
          (member item (cdr list)))))

したがって、LIST が NIL の場合、関数全体が NIL を返します。

于 2013-05-22T06:11:12.507 に答える