2

なぜこれが私に説明できますか:

(remove-if #'(lambda (var) (member var (list "x"))) (list "x" "y" "z"))

これを返します:

("x" "y" "z")

でもこれは:

(remove-if #'(lambda (var) (member var (list 1))) (list 1 2 4))

これを返します:

(2 4)

?

4

1 に答える 1

4

答え

:test #'equalに渡すmember:

(remove-if #'(lambda (var) (member var (list "x") :test #'equal)) (list "x" "y" "z"))
==> ("y" "z")

ご了承ください

(eql "x" "x")
==> NIL
(equal "x" "x")
==> T
(eql 1 1)
==> T

理由

Common Lispのデフォルトの1 引数テストは ですeql

これは、ANSI CL 標準で提供されている 4(!) 個の汎用比較関数の中から最も合理的な選択です。

  • eq実装に依存しすぎて、おそらく数字や文字で望むようには機能しません
  • equalオブジェクトをequalpトラバースするため、巨大なオブジェクトの場合は時間がかかり、円形のオブジェクトの場合は終了しない場合があります。

Common Lispのの違いeqeqlequalequalpも参照してください。

正しい道

+set-differenceの代わりに使用します。remove-ifmember

于 2014-11-10T02:55:50.880 に答える