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)