2016-11-15 2 views
0

Common lisp에서 이것을 달성하는 방법은 무엇입니까?논리 목록에서 선택하십시오. Common Lisp

(logselect (t nil t) (list1 list2 list3)) ---> (list1 list2) 

아래의 기능을 코딩했지만 더 나은 방법이 있다고 생각합니다 (내장 기능일까요?).

(defun logselect (loglist lista) 
    (let ((listaL) (maskL) (toremove)) 
     (setq listaL (mapcar #'list lista)) 
     (setq maskL (mapcar #'cons loglist listaL)) 
     (setq toremove (mapcar #'(lambda (x) (car (and (car x) (cdr x)))) maskL)) 
     (remove nil toremove) 
    ) 
) 

감사합니다.

+0

내 말은 (logselect (t nil t) (list1 list2 list3)) ---> (list1 list3) – Francisco

답변

1

이 쉽게 LOOP를 사용하여 수행됩니다 : 당신이 더 "Lisp 다운"솔루션을 선호하는 경우

(defun logselect (loglist lista) 
    (loop for test in loglist 
      for value in lista 
    when test collect value)) 

, 당신은 mapcan으로 작업을 수행 할 수 있습니다

(defun logselect (loglist lista) 
    (mapcan #'(lambda (test value) 
       (when test (list value))) 
      loglist lista)) 

mapcan 당신이 원하는 경우에 유용한 기능입니다 조건부로 목록 요소를 추가하는 매핑 함수를 사용합니다. 이 함수는 목록을 반환하고 최종 결과를 만들기 위해 모두 연결되므로 무언가를 추가하고 싶지 않으면 빈 목록을 반환 할 수 있습니다.

+0

대단히 감사합니다. – Francisco