Lisp有类似Haskell的takeWhile函数吗?

Mik*_*ike 6 lisp haskell functional-programming common-lisp

我是Common Lisp的新手.在Haskell中,你可以做一些像这样的事情:

Prelude> takeWhile (<= 10) [k | k <- [1..]]
[1,2,3,4,5,6,7,8,9,10]
Run Code Online (Sandbox Code Playgroud)

这在Lisp中是否可行?不一定有无限列表,但有任何列表.

dan*_*lei 13

你可以使用LOOP:

(setq *l1* (loop for x from 1 to 100 collect x))
(loop for x in *l1* while (<= x 10) collect x)
Run Code Online (Sandbox Code Playgroud)

如果你真的需要它作为一个单独的功能:

(defun take-while (pred list)
  (loop for x in list
        while (funcall pred x)
        collect x))
Run Code Online (Sandbox Code Playgroud)

我们在这里:

T1> (take-while (lambda (x) (<= x 10)) *l1*)
(1 2 3 4 5 6 7 8 9 10)
Run Code Online (Sandbox Code Playgroud)

但是,如果我们比较:

(loop for x in *l1* while (<= x 10) collect x)
(take-while (lambda (x) (<= x 10)) *l1*)
Run Code Online (Sandbox Code Playgroud)

我想我会坚持循环.

对于无限序列,您可以查看系列:

T1> (setq *print-length* 20)
20
T1> (setq *l1* (scan-range :from 1))
#Z(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...)
T1> (until-if (lambda (x) (> x 10)) *l1*)
#Z(1 2 3 4 5 6 7 8 9 10)
Run Code Online (Sandbox Code Playgroud)