也许到了晚上已经太晚了,但是我似乎无法弄清楚这一点。我正在创建看起来像这样的东西
(defn new-psf
[props]
(let [psf (Psf.)]
(if (contains? props :pageLn)
(.setPageLn psf (props :pageLn)))
(if (contains? props :pageNum)
(.setPageNum psf (props :pageLn)))
(if (contains? props :includedSources)
(doseq [s (props :includedSources)]
(.add (.getIncludedSources psf) s)))
psf))
现在,这看起来很丑陋,我不得不认为,重复模式在Clojure中提供了一种更简洁的方法。cond *函数似乎都不适合。我自己对宏的定义还不够好,无法创建新的东西。
任何人都对宏有任何想法,可以让我做这样的事情:
(defn new-psf
[props]
(let [psf (Psf.)]
(condd (partial contains? props)
:pageLn (.setPageLn psf (props :pageLn))
:pageNum (.setPageNum psf (props :pageNum))
:includedSources (doseq [s (props :includedSources)]
(.add (.getIncludedSources psf) s)))
psf))
我不确定您的Psf类是什么,所以让我们在一个熟悉的类上进行此操作
(def frame (doto (new javax.swing.JFrame)
(.setContentPane (javax.swing.JPanel.))))
属性图
(def props {:title "test"
:background java.awt.Color/blue
:buttons ["foo" "bar" "baz"]})
if
您可以使用地图代替一系列s
(def option-application
{:title (fn [x v] (.setTitle x v))
:background (fn [x v] (.setBackground (.getContentPane x) v))
:buttons (fn [x v] (doseq [btn v] (.add x (javax.swing.JButton. btn))))})
并根据 props
(doseq [[k v] props] ((k option-application) frame v))
让我们看一下我们漂亮的框架
(doto frame (.pack) (.setVisible true))
如果道具中缺少钥匙,则它在选项应用程序中的相应动作将永远不会被调用。如果顺序很重要,请使用数组映射。
注意仍然有很多重复,因为对于每个键,我都包装了一个类似名称的setter。跷跷板使用反射来处理所有这一切。看到apply-options
那里,它应该足够通用以用于您的课程。跷跷板还有一个cond-doto
您可能想借的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句