2012-12-18 14 views
14

W języku Python funkcje all i any zwracają wartość true, jeśli wszystkie lub niektóre elementy listy są prawdziwe. Czy w Common Lisp istnieją równoważne funkcje? Jeśli nie, jaki jest najbardziej zwięzły i idiomatyczny sposób ich napisania?Common Lisp: wszystkie elementy są prawdziwe na liście

Obecnie mam to:

(defun all (xs) 
    (reduce (lambda (x y) (and x y)) xs :initial-value t)) 

(defun any (xs) 
    (reduce (lambda (x y) (or x y)) xs :initial-value nil)) 

Odpowiedz

24

W Common Lisp, użyj every (to odpowiednik all) i some (to odpowiednik any).

6

Można użyć makra pętli z ALWAYS i THEREIS klauzul tak:

CL-USER 1 > (loop for item in '(nil nil nil) always item) 
NIL 

CL-USER 2 > (loop for item in '(nil nil t) always item) 
NIL 

CL-USER 3 > (loop for item in '(t t t) always item) 
T 

CL-USER 4 > (loop for item in '(nil nil nil) thereis item) 
NIL 

CL-USER 5 > (loop for item in '(nil nil t) thereis item) 
T 

CL-USER 6 > (loop for item in '(t t t) thereis item) 
T