2014-11-25 91 views
4

我有一个功能“my-func”,它处理地图x它获取作为参数并返回一张地图。处理过程非常漫长,因此我将其转移到函数block-with-several-function-calls-on-x 如果传入地图包含:special-key,则应将附加的键值对添加到传出地图中。什么是“做额外的东西,当...”的Clojure方式

(defn my-func [x] 
    (if (contains? x :special-key) 
    (assoc (block-with-several-function-calls-on-x x) 
      :extra-key true) 
    (block-with-several-function-calls-on-x x))) 

我真的想保持内my-funcblock-with-several-function-calls-on-x的代码。我使用其他编程语言,我只是简单地将该部分的输出保存在一个变量中,并且(如有必要)之后添加附加部分并返回值。我被告知使用let不是“Clojuresque”。

那么,将代码传递给一个函数(就像我上面做的那样)是唯一的方法?或者是一个do-additonal-stuff-to-output-of-second-block -function:

(defn my-func [x] 
    (do-additional-stuff-to-output-of-second-block 
    (when (contains? x :special-key) 
     (assoc :extra-key true)) 
    (block-with-several-function-calls-on-x x))) 
+0

“使用让不是Clojuresque” - 这是荒谬和搞笑的错误,并说这个人不太了解Clojure – noisesmith 2014-11-25 15:06:14

+0

也许有一些沟通不畅?例如,让我们不创建“变量”。无论如何,执行此操作的标准方法是使用let。 – noisesmith 2014-11-25 15:13:05

回答

0

下面的选项可能比你目前一个更地道和简洁。它避免了重复对block-with-several-function-calls-on-x函数的调用,并使用when来传达条件中缺少备选项的含义。

(defn block-with-several-function-calls-on-x [x] 
    x) 

(defn my-func [x] 
    (into (block-with-several-function-calls-on-x x) 
     (when (contains? x :special-key) 
      {:extra-key true}))) 

(my-func {:bla 1 :special-key 2}) 
;= {:bla 1, :special-key 2, :extra-key true} 
(my-func {:bla 1}) 
;= {:bla 1} 
3

cond->cond->>->->>有条件的版本,并可能适合你的需要:

(defn my-func 
    [x] 
    (cond-> (block-with-several-function-calls-on-x x) 
    (contains? x :special-key) (assoc :extra-key true) 
    (contains? x :other-key) (dissoc :we-dont-need-this))) 

虽然,只有一个条件,这可能不是可读性的缩影。

+0

现在,这是一个downvote我真的不明白... – xsc 2014-11-25 15:43:30

1

尽管你有意见,我会使用let

(defn my-func [x] 
    (let [ans (block-with-several-function-calls-on-x x)] 
    (if (contains? x :special-key) 
     (assoc ans :extra-key true) 
     ans))) 

注:

  • 你提到的唯一价值是布尔值。如果全部您的值是 布尔值,请使用set而不是map。
  • 如果不是,我怀疑你有错误(falsenil)值。在 他们的缺席,你可以用 (x :special-key)(:special-key x)替换(contains? x :special-key)
相关问题