Lisp:循环收集多个列表

时间:2016-12-28 16:30:21

标签: loops lisp common-lisp

我希望能够在循环中收集多个列表。

我知道这可以在没有循环的情况下完成,但是我想知道这是否也可以用循环。我想要这样的事情:

if(sizeof(array_diff($gameids,$ggids) > 2)) {
    print "<script>alert('You have more than two games')</script>";
    } else {
    print "<script>alert('You have less than two games')</script>";
   }

我收到 (loop for var in list (if (cond1 var) (if (cond2 var) collect into list1 collect into list2)) finally (list list1 list2)) 的错误,我想应该在LOOP keyword is expectedwhen之后立即使用收藏。有什么方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

你有几个问题。

首先,如果要将普通的Lisp代码放入循环体中,则需要do关键字。但您可以使用do的{​​{1}}或when关键字代替。

其次,if关键字要求您指定要收集到列表中的表达式,例如collect

第三,您需要使用collect var into list1(return expression)子句中的表单中返回值。

finally

答案 1 :(得分:2)

信不信由你括号太多loop有自己的小子语言,与Common Lisp s-expressions完全不同。

(loop :for var :in list
      :when (cond1 var)
        :if (cond2 var)
           :collect var :into list1
        :else
           :collect var :into list2
        :end
      :end
      :finally (return (list list1 list2)))

此外,我还指定了:collect:finally只需评估的内容,因此您需要使用(return ...),否则您可以期待nil

我使用loop个关键字的关键字将其与其他符号区分开来。这只是风格。缩进当然是被忽略的,只是为了便于阅读,但:end并非如此。但是,在这种情况下,:end个关键字都是多余的,因为loop在没有它们的情况下正确解析。

我绝不是loop wiz ..每当我得到一些稍微复杂的东西时,我倾向于使用Land of Lisp的周期表或Loop for black belts,来自Practical Common Lisp的章节。

Periodic table of Loop Macro