在Common Lisp循环中的条件下收集并执行某些操作

时间:2017-11-11 21:28:41

标签: loops lisp common-lisp

除了"收集"我还需要执行一条指令。在一个循环的条件下,我无法找出一个有效的语法...

例如,我希望以下代码打印i并在2< 1< 1< 1< 1< 1>岛

(loop for i '(1 2 3 4) in  when (< 2 i) (print i) collect i)  ==> (3 4)

希望你能帮忙!

3 个答案:

答案 0 :(得分:5)

:if:when中的多个条款需要由:and加入。关键字:end实际上会被忽略,除了让您感觉更轻松阅读之外别无其他。

(loop :for i :in '(1 2 3 4)
      :when (< 2 i) 
        :do (print i) 
        :and :collect i
      :end)  ; ==> (3 4) (and prints 3 and 4 as side effect)

我建议你阅读LOOP for Black Belts。如果你看right above this part,你会在稍微复杂的例子中看到:and

注意:loop接受来自任何包的符号,因此我的风格是使用关键字包不要用loop关键字污染我自己的包,我的编辑器会稍微强调它。你不需要按照我的方式去做: - )

答案 1 :(得分:4)

CL-USER 71 > (loop for i in '(1 2 3 4)
                   when (> i 2)
                     do (print i) and collect i)

3        ; printed
4        ; printed
(3 4)    ; return value

答案 2 :(得分:1)

在你的情况下,使用print的返回值会更短:

(loop for i in '(1 2 3 4) when (> i 2) collect (print i))