2

我有这些功能:

(def i (atom {})) ;incremented/calculated file stats

(defn updatei [n fic fos]
  (swap! i conj {(keyword n)[fic fos]}))

(defn calcfo [fo fi fis]
  (if-let [n (get @i fo)] ;find a previous record?
    (let [fic (inc (first n)), fos (+ fis (second n))] ;increment the stats
      (updatei fo fic fos))
    (let [fic 1, fos fis] ;if not then: first calc recorded
      (updatei fo fic fos))))

我如何编写 (updatei fo fic fos) 一次,而不是在函数中列出两次?有什么我不知道的秘密吗?

-假设代码-

(defn calcfo [fo fi fis]
  (if-let [n (get @i fo)] ;find a previous record?
    (let [fic (inc (first n)), fos (+ fis (second n))] ;increment the stats
    (or-let [fic 1, fos fis] ;if not then: first calc recorded
      (updatei fo fic fos)))))

还是我在考虑这一点过于迫切而不是功能上?

编辑:

我认为这对我来说最有意义:

(defn calcfo [fo fis]
  (apply updatei fo
  (if-let [[rfc rfos] (get @i fo)] ;find a previous record?
       [(inc rfc) (+ rfos fis)] ;increment the stats
       [1 fis]) ;if not then: first calc recorded
      ))

感谢您的精彩回答!

4

3 回答 3

3

那么使用if然后解构呢?这是一种方法:

(defn calcfo [fo fi fis]
  (let [n         (get @i fo)                                 ;find a previous record?
        [fic fos] (if n 
                    [(-> n first inc) (-> n second (+ fis))]  ;increment the stats
                    [1 fis])]                                 ;if not then: first calc recorded
      (updatei fo fic fos)))

该参数fi似乎没有被使用,因此也许您可以将其从参数列表中删除。

(defn calcfo [fo fis] ,,,)

在以以下形式绑定时,也可以通过使用解构来避免使用firstand :secondnlet

(defn calcfo [fo fis]
  (let [[x y & _]  (get @i fo)
        [fic fos]  (if x [(inc x) (+ fis y)] [1 fis])]
    (updatei fo fic fos)))
于 2013-07-10T19:19:40.177 回答
3

重新安排可能会有所帮助

(defn calcfo [fo fi fis]
  (apply updatei fo
    (if-let [n (get @i fo)]
      [(inc (first n)), (+ fis (second n))]
      [1, fis] )))
于 2013-07-10T20:00:57.977 回答
2

我认为如果你重写,你会回避整个问题并使你的代码更好updatei,比如:

 (defn- safe+ [a b]
   (if a (if b (+ a b) a) b))
 (defn updatei [n fic fos]
   (swap! i update-in [(keyword n)] #(vector (safe+ fic (first %)) (safe+ fos (second %)))))

编写该代码可能有更好的方法,但基本思想是用于update-in存储新值(如果之前没有为该键存储任何内容),或者将它们与已经存在的值结合起来。

于 2013-07-10T19:39:43.670 回答