2017-10-29 2 views
0

Angenommen, ich möchte einen Schritt (Element) aus der Liste der Zustände löschen.Mehr als ein Argument für Prädikat in delete-if

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

Wenn ich (delete-if #'equal-state? *states*) dann, wie das zweite Argument (state) auf Prädikat übergeben werden?

bearbeitet: Ich habe endlich eine ähnliche Frage gefunden, aber ich bin geneigt, es wegen der Klarheit in der Frage zu behalten.

+1

NB:

Man kann auch remove/delete verwenden. In diesem Beispiel verwenden Sie DELETE, das berechtigt ist, Daten zu mutieren, aber Ihre Daten sind konstant (Liste in Anführungszeichen) und sollten in portablen Programmen nicht geändert werden. – coredump

Antwort

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

oder

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)) 

als Benutzer coredump erwähnt, ist eine potentiell delete-if destruktive Operation. Die zerstörungsfreie Alternative zu delete-if ist remove-if.

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

@coredump angedeutet, dass konstante Daten nicht in tragbaren Programmen geändert werden soll ... meine Lisp-Implementierung warnt mich auch über die konstanten Daten .. Ich kann einfach nicht meinen Kopf darum wickeln .. und "konstante Daten in tragbaren Programmen?" –

+1

@BilalQadri: Wenn Sie '' (a b c) 'in Ihrem Programm geschrieben haben, ist es eine Liste in Anführungszeichen. Diese Liste besteht aus Literaldaten. Es ist nicht spezifiziert, was passiert, wenn Sie es ändern. Könnte funktionieren, könnte Nebenwirkungen haben, könnte stillschweigend fehlschlagen, könnte einen Fehler verursachen. Nicht spezifiziert. Eine neue Liste wird mit Funktionen wie LIST, COPY-LIST und vielen anderen erstellt. Wenn Sie eine Literalliste in REPL eingeben, besteht eine gute Chance, dass Sie sie ändern können, ohne dass Probleme auftreten. Dies ist jedoch in der Regel nicht der Fall. Vor allem im kompilierten Code wird es wahrscheinlich Probleme verursachen. Das ist nicht Lisp-spezifisch. Andere Sprachen haben ähnliche Probleme. –

Verwandte Themen