我希望能够在循环中收集多个列表。
我知道这可以在没有循环的情况下完成,但是我想知道这是否也可以用循环。我想要这样的事情:
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 expected
或when
之后立即使用收藏。有什么方法可以解决这个问题吗?
答案 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的章节。