Clojure 将函数列表组合到当前上下文中

Clojure 将函数列表组合到当前上下文中,clojure,clojurescript,Clojure,Clojurescript,我不熟悉Clojurescript和LISPy语言,所以请原谅我的命令式思维方式 我用Raphael.js画了一些东西。它允许您定义一个集合,将对象推入集合(例如,一个圆、一个矩形和一条路径),然后执行作用于所有项目的操作(例如:应用于所有项目的旋转) 因此我们可以有(其中,纸张基本上是svg元素): 它将创建一个集合,并使用多个调用push,每次都返回集合,最终调用transform。现在,如果我想在运行时创建一个对象列表,比如说circle,并将它们添加到集合中,该怎么办?理想情况下,我希望

我不熟悉Clojurescript和LISPy语言,所以请原谅我的命令式思维方式

我用Raphael.js画了一些东西。它允许您定义一个集合,将对象推入集合(例如,一个圆、一个矩形和一条路径),然后执行作用于所有项目的操作(例如:应用于所有项目的旋转)

因此我们可以有(其中,
纸张
基本上是svg元素):

它将创建一个集合,并使用多个调用
push
,每次都返回集合,最终调用
transform
。现在,如果我想在运行时创建一个对象列表,比如说
circle
,并将它们添加到集合中,该怎么办?理想情况下,我希望能够将上述代码块的第3行替换为以下内容(非常粗略-我完全不确定如何处理
.push

以创建沿y轴向下的5个圆。用我对Clojure的有限理解,我无法完全理解的是如何以一种相当自动化的方式来做这样的事情,而不必求助于其他地方的
doseq
。我不想要副作用。我想以某种方式创建一个推送列表,然后让它们全部组合到我的块中。可能吗?我的思想中可能有一个巨大的缺陷,我真的非常感谢任何能指出这一点的人


非常感谢。

避免副作用有点棘手,因为
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)))

非常感谢。我试图使用
reduce
在某一点上执行此操作。我说我想避免副作用是有点不对劲的,因为你说的
.push
无论如何都会改变状态,这是正确的。不幸的是,我没有足够的声誉来提升你,所以我给你发了一些现实生活中的因果报应。
(.push (map (fn [i] (.ellipse paper 10 (* i 10) 10 10)) (range 5)))
(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)))