2017-10-29 5 views
0

状態リストから1つのステップ(要素)を削除したいとします。delete-ifの述部に複数の引数があります

(defparameter *states* '((:top nil nil) (:subjects nil nil))) 
;predicate 
(defun equal-state? (step state) 
    (equal (car step) state)) 

私は2番目の引数(state)が述語に渡すことができるか、その後(delete-if #'equal-state? *states*)を使用している場合は?

私はようやく同様の質問を見つけましたが、質問の明快さのためにそれを保持する傾向があります。言及ユーザコアダンプとして

+1

NB:

1つはまたremove/deleteを使用することができます。この例では、データの変更を許可されているDELETEを使用していますが、データは定数(引用符付きのリスト)なので、移植可能なプログラムでは変更しないでください。 – coredump

答えて

3
CL-USER 67 > (let ((state :top)) 
       (delete-if (lambda (step) 
          (equal-state? step state)) 
          *states*)) 
((:SUBJECTS NIL NIL)) 

又は

CL-USER 68 > (defun make-predicate (state) 
       (lambda (step) 
       (equal-state? step state))) 
MAKE-PREDICATE 

CL-USER 69 > (delete-if (make-predicate :subjects) 
         *states*) 
((:TOP NIL NIL)) 

delete-ifは、潜在的に破壊的な動作です。 delete-ifの非破壊的な代替はremove-ifです。

CL-USER 77 > (remove :subjects 
        '((:top nil nil) 
         (:subjects nil nil)) 
        :key #'first 
        :test #'equal) 
((:TOP NIL NIL)) 
+0

@coredumpはポータブルプログラムで定数データを変更すべきではないことを暗示しています...私のlisp実装は定数データについて警告します..私は頭を包んではいけません。 –

+1

@BilalQadri:あなたのプログラムに ''(a b c)が書かれていれば、それは引用されたリストです。このリストはリテラルデータです。あなたがそれを変更すると何が起こるかは不明です。うまく動作し、副作用があり、黙って失敗する可能性があり、エラーが発生する可能性があります。不特定。 LIST、COPY-LISTなどの機能を備えた新しいリストが作成されます。 REPLへのリテラルリストを入力すると、問題を見ることなく修正することができますが、一般的にはそうではありません。特にコンパイルされたコードでは、問題を引き起こす可能性があります。これはLisp特有のものではありません。他の言語にも同様の問題があります。 –

関連する問題