我对Clojurescript和LISPy语言都很陌生,所以请原谅我的必要思维方式。
我使用Raphael.js绘制一些东西。它允许您定义一个集合,将事物推入集合(例如,圆形,矩形和路径),然后执行对所有项目起作用的操作(例如:适用于所有项目的旋转)。
所以我们可以(其中paper
基本上是svg元素):
(-> (.set paper)
(.push (.ellipse paper 10 10 10 10))
(.push (.circle paper 10 10 10 10))
(.transform (format "r%.2f" 180)))
这将创建一个集合并使用多次调用push
,每次都返回该集合,最终调用transform
。现在,如果我想在运行时创建说circle
个对象的列表并将它们添加到集合中,该怎么办?理想情况下,我能够做的就是将上述代码块中的第3行替换为类似的内容(非常粗略 - 我完全不确定如何处理.push
)
(.push (map (fn [i] (.ellipse paper 10 (* i 10) 10 10)) (range 5)))
为了创建沿y轴向下的5个圆圈。在我对Clojure的有限把握中,我能够非常清楚地知道如何以一种相当独特的方式做这样的事情而不诉诸于其他地方的doseq
。我不想要副作用。我想以某种方式创建一个推送列表,然后将它们全部组合到我的块中。那可能吗?在某些地方我的想法可能存在巨大的缺陷,我真的非常感谢能够指出这一点的人。
非常感谢。
答案 0 :(得分:2)
避免副作用有点棘手,因为push
显然会改变集合。避免doseq
的一种方法是使用reduce
。例如:
(def shapes [ (.circle paper 10 10 10 10) (.ellipse paper 10 10 10 10) ] )
(defn push-all [set shapes]
(reduce #(.push %1 %2) set shapes))
(-> (.set paper)
(push-all shapes)
(.transform (format "r%.2f" 180)))