B. Pym
2024-09-13 19:22:53 UTC
What about dealing with an arbitrary number of filters?
(defmacro predicate-collect (list &body predicates)
(let ((collectors (mapcar (lambda (predicate)
(declare (ignore predicate))
(gensym "COLLECT"))
predicates))
(collect-t (gensym "COLLECT")))
(dolist (l ,list)
`((funcall ,predicate l) (,collector l)))
predicates collectors)
(t (,collect-t l)))))))
(lambda (n) (< n 0))
(lambda (n) (> n 3)))
(-4 -2 0 2 4)
(-5 -3 -1)
(5)
(1 3)
I use the list collector macros by Tim Bradshaw here - see
http://www.tfeb.org/lisp/hax.html#COLLECTING
Gauche Scheme(defmacro predicate-collect (list &body predicates)
(let ((collectors (mapcar (lambda (predicate)
(declare (ignore predicate))
(gensym "COLLECT"))
predicates))
(collect-t (gensym "COLLECT")))
(dolist (l ,list)
`((funcall ,predicate l) (,collector l)))
predicates collectors)
(t (,collect-t l)))))))
(predicate-collect '(-5 -4 -3 -2 -1 0 1 2 3 4 5)
(function evenp)(lambda (n) (< n 0))
(lambda (n) (> n 3)))
(-4 -2 0 2 4)
(-5 -3 -1)
(5)
(1 3)
I use the list collector macros by Tim Bradshaw here - see
http://www.tfeb.org/lisp/hax.html#COLLECTING
(define (multi-partition the-list . predicates)
(if (null? predicates)
(list the-list)
(receive (yes no)
(partition (car predicates) the-list)
(cons yes (apply multi-partition no (cdr predicates))))))
(multi-partition '(-5 -4 -3 -2 -1 0 1 2 3 4 5)
even?
(is < 0)
(is > 3))
((-4 -2 0 2 4) (-5 -3 -1) (5) (1 3))
Given:
(define-syntax is
(syntax-rules ()
[(is x)
(lambda (y) (equal? y x))]
[(is compare x)
(lambda (y) (compare y x))]
[(is key compare x)
(lambda (y) (compare (key y) x))]))