在Clojure中重写一系列if语句

戴夫·金凯德(Dave Kincaid)

也许到了晚上已经太晚了,但是我似乎无法弄清楚这一点。我正在创建看起来像这样的东西

(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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

简化Python中的一系列elif语句

来自分类Dev

haskell中的一系列独立的if语句

来自分类Dev

如何减少一系列if语句?

来自分类Dev

如何在node.js中用Q promise重写一系列条件语句?

来自分类Dev

嵌套if ... else语句如何胜过一系列C ++中的单选if语句

来自分类Dev

给定Clojure中的一系列映射,如何过滤键值>(某些值)?

来自分类Dev

如何从clojure的向量中的一系列映射中删除给定键?

来自分类Dev

Clojure,具有一系列功能的映射

来自分类Dev

如何回滚JPA中的一系列persistent语句?

来自分类Dev

在C ++中,switch语句中可以有一系列值吗?

来自分类Dev

如何在C#中的if语句中分配一系列数字?

来自分类Dev

是否可以编写一系列重复引用PHP中单个对象的语句?

来自分类Dev

将SELECT语句中的行插入一系列列中

来自分类Dev

在C ++中,switch语句中可以有一系列值吗?

来自分类Dev

覆盖一系列的case语句吗?

来自分类Dev

用基于接口的方法替换一系列if语句

来自分类Dev

如何干燥这一系列条件语句?

来自分类Dev

为If / Then语句包括一系列单元格

来自分类Dev

Excel;使用if语句查找一系列值的中值

来自分类Dev

C - 一系列 if 语句与 else if 时间测量

来自分类Dev

简化一系列 IF THEN

来自分类Dev

从iOS中的一系列对象中获取价值

来自分类Dev

从 jquery 中的一系列值中获取数据

来自分类Dev

在angularjs中创建一系列显示/隐藏屏幕

来自分类Dev

找到一系列数值中的最大间隙

来自分类Dev

消除Python中的一系列.replace()调用

来自分类Dev

Grep用于R中的一系列数字

来自分类Dev

如何从一系列样本中创建Observable?

来自分类Dev

如何在python中搜索一系列行?

Related 相关文章

热门标签

归档