2017-10-29 3 views
0

상태 목록에서 하나의 단계 (요소)를 삭제한다고 가정합니다.delete-when의 술어에 대한 인수가 두 개 이상인 경우

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

내가 두 번째 인수 (state)이 선언문에 전달 될 수 그럼 어떻게 (delete-if #'equal-state? *states*)을 사용하는 경우?

편집 : 나는 마침내 비슷한 질문을 발견했지만, 질문의 명확성 때문에 그것을 유지하려고합니다.

+1

NB :

하나는 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에만 국한된 것은 아닙니다. 다른 langs도 비슷한 문제가 있습니다. –

관련 문제