如何解决Clojure Loop只能从尾巴位置重现
我想创建500个圆,但是仅在新圆不与现有圆不碰撞时才添加。
这是我的循环
(let [total-circles 500
circles (loop [n 0 {:keys [x y d] :as circle} (create-circle) circles ()]
(cond
(>= n total-circles) circles
(if (not (does-circle-have-a-collision circles circle))
(recur (inc n) (create-circle) (conj circles circle))
(recur n (create-circle) circles))
:else (recur (inc n) (create-circle) circles)))])
错误消息是
语法错误(UnsupportedOperationException)编译再次出现在(sketch / dynamic.clj:82:21)。 只能从尾巴位置再次出现
我的代码有什么问题?
解决方法
cond
接受对中的子句,特别是test
/ expr
对。这意味着cond
内应始终具有偶数形式,而您的则没有。您的(if ...)
表单位于test
的位置,后面没有expr
。如果我们缩写以查看结构,则它看起来像这样:
(cond
;; test ;; expr
(>= ...) circles
(if ...) !!!missing!!!
:else (recur ...))
一种解决方法是从您的if
中取出测试,但放下if
,如下所示。 (注意:我没有测试就重新排列了您现有的逻辑,所以不确定是否可以实际运行,但是结构正确。另外,我将test
/ expr
对放在单独的行上并缩进了{ {1}} s,让他们脱颖而出。)
expr
在上面,可以从任何(cond
;; test
;; expr
(>= n total-circles)
circles
(does-circle-have-a-collision circles circle)
(recur n (create-circle) circles)
:else
(recur (inc n) (create-circle) (conj circles circle)))
子句中调用recur
。
您正在跟踪您可能不需要的expr
/ loop
中的绑定。例如,当您只需查看圈子集合中的recur
时,就无需跟踪n
。假设您有一个功能
count
如果不与(defn add-if-no-overlap [coll c] ...)
中已有的任何圆圈重叠,则返回添加了coll
的{{1}},否则返回c
。然后,您可以像这样生成500个不重叠的圈子:
coll
,
您的cond
结构错误。结构应为
(cond if1 then1
if2 then2
if3 then3)
但是你有
(cond if1 then1
???mystery stuff???
if2 then2)
以cond
期望的方式重构您的神秘事物。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。