22 lines
585 B
Common Lisp
22 lines
585 B
Common Lisp
(defun take (seq &optional (n 1))
|
|
(values-list (loop repeat n collect (funcall seq))))
|
|
|
|
(defun power-seq (n)
|
|
(let ((x 0))
|
|
(lambda () (expt (incf x) n))))
|
|
|
|
(defun filter-seq (s1 s2) ;; remove s2 from s1
|
|
(let ((x1 (take s1)) (x2 (take s2)))
|
|
(lambda ()
|
|
(tagbody g
|
|
(if (= x1 x2)
|
|
(progn (setf x1 (take s1) x2 (take s2)) (go g)))
|
|
(if (> x1 x2)
|
|
(progn (setf x2 (take s2)) (go g))))
|
|
|
|
(prog1 x1 (setf x1 (take s1))))))
|
|
|
|
(let ((2not3 (filter-seq (power-seq 2) (power-seq 3))))
|
|
(take 2not3 20) ;; drop 20
|
|
(princ (multiple-value-list (take 2not3 10))))
|