Kev*_*gem 3 lisp loops common-lisp
我希望能够在循环内收集多个列表。
我知道这可以在没有循环的情况下完成,但是我想知道这是否也可以通过循环来完成。我想要这样的东西:
(loop for var in list
(if (cond1 var)
(if (cond2 var)
collect into list1
collect into list2))
finally (list list1 list2))
Run Code Online (Sandbox Code Playgroud)
我得到的错误是LOOP keyword is expected,我猜应该在 awhen或 a之后立即使用 collect loop。有什么办法可以解决吗?
信不信由你有太多的括号。loop有自己的小子语言,这与 Common Lisp 的 s 表达式完全不同。
(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)))
Run Code Online (Sandbox Code Playgroud)
另外我指定什么:collect和:finally公正评价,所以你需要使用(return ...),否则你可以期待nil。
我使用关键字作为loop关键字来区分它们与其他符号。这只是风格。缩进当然被忽略,只是为了可读性,但:end不是。但是在这种情况下,两个:end关键字都是多余的,因为loop没有它们就可以正确解析。
我绝不是一个loop奇才......每次我得到一些稍微复杂的东西时,我倾向于使用Land of Lisp的周期表或黑带循环,实用Common Lisp的一章。
你有几个问题。
首先,如果要将普通的 Lisp 代码放入循环体,则需要do关键字。但是您可以改用do'swhen或if关键字。
其次,collect关键字要求您指定要收集到列表中的表达式,例如collect var into list1。
第三,您需要使用(return expression)从finally子句中的形式返回一个值。
(loop for var in list
when (cond1 var)
if (cond2 var)
collect var into list1
else
collect var into list2
finally (return (list list1 list2)))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1213 次 |
| 最近记录: |