2012-02-16 2 views
2

목록의 목록을 얻었으므로 그 목록의 특정 종류를 제거하고 싶습니다. 그러므로 나는 람다 식으로 remove-if-not를 사용할 것이다. 그러나 목록을 지우는 지 여부를 결정하기 위해 목록의 모든 요소를 ​​검토 할 필요가 없을 수도 있습니다. 결론은 반환이 필요하다는 것입니다. 하지만 익명의 람다 함수에 어떻게 적용 할 수 있습니까?람다 함수에서 return-from을 사용할 수 있습니까

(defvar *listlist* (list (list 1 2 3) (list 3 4 5) (list 5 6 7) (list 7 8 9))) 

(remove-if-not #'(lambda (arg) 
        (dolist (x arg) 
        (when (= x 3) 
         (return-from lambda t))) 
        nil) 
       *listlist*) 

또 다른 것은, 날 귀찮게 대신 DOLIST의 mapcar 등등의 사용 가능성,하지만 지금 돌아-에서 두 개의 람다 함수가하는 것처럼 다음 내 문제는 더 악화 가져옵니다.

+0

외부 람다에서 alambda를 사용하고 내부에서 람다를 사용하는 경우 self에서 return-from을 수행 할 수 있습니다. 체크 아웃에 대한 내면은 –

답변

3

dolist은 암시 적 블록을 설정하므로 return을 사용할 수 있습니다. 더 읽기 here. 또한 dolist을 명시 적 block으로 감쌀 수 있으므로 return-from을 사용할 수 있습니다.

+0

블록 힌트가 완벽하게 맞는, 나는 람다 함수의 구멍 양식 주위 블록을 포장 감사드립니다. – Sim

1

당신은 또한 사용할 수 있습니다 그레이엄의 alambda, 당신은에서 반환하는 DOLIST 블록이 일이없는 곳의 경우, (대신 람다 단지 'A'에서 앞을 추가) :

(remove-if-not 
    (alambda (arg) 
    (dolist (x arg) 
     (when (= x 3) 
     (return-from self t)) 
     nil)) 
    *listlist*) 

을 이것은 일반적인 경우, 멀리 코딩하고 람다 함수를 작성하는 경우에 작동합니다. 그런 다음 람다 함수를 작성하면 람다라는 이름이 필요하므로 반환 할 수 있습니다. 이 시점에서 람다에 'a'를 추가하고 자기로부터 돌아옵니다.

관련 문제