“Clojure”的方式是什么;在……时做额外的事情。”;

“Clojure”的方式是什么;在……时做额外的事情。”;,clojure,functional-programming,conditional,Clojure,Functional Programming,Conditional,我有一个函数“myfunc”,它处理作为参数获取的映射x,并返回映射。处理过程相当长,因此我在这里将其转移到函数block-with-multi-function-calls-on-x 如果传入映射包含:特殊密钥,则应向传出映射添加额外的键值对 (defn my-func [x] (if (contains? x :special-key) (assoc (block-with-several-function-calls-on-x x) :extra-key

我有一个函数“
myfunc
”,它处理作为参数获取的映射
x
,并返回映射。处理过程相当长,因此我在这里将其转移到函数
block-with-multi-function-calls-on-x
如果传入映射包含
:特殊密钥
,则应向传出映射添加额外的键值对

(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)))
我真的希望将
block-with-multi-function-calls-on-x
的代码保留在
my func
中。如果使用其他编程语言,我只需将该部分的输出保存在一个变量中,然后(如有必要)添加附加部分,然后返回值。有人告诉我,使用
let
不是“Clojureque”

那么,将代码传输到函数(正如我上面所做的)是唯一的方法吗?或者a
是否为第二个块的输出添加了附加内容
-功能:

(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)))

以下选项可能比您当前的选项更为惯用和简洁。它避免了重复调用
block-with-multi-function-calls-on-x
函数,并在
时使用
来传达条件语句中缺少替代项的含义

(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}

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)))

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

尽管你有建议,我还是使用
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)))
注:

  • 您提到的唯一值是布尔值。如果你所有的价值观 布尔值,使用集合,而不是映射
  • 如果没有,我怀疑您是否有false(
    false
    nil
    )值。在里面 如果它们不存在,您可以将
    (包含?x:特殊键)
    替换为
    (x:特殊键)
    (:特殊键x)

“使用let不是Clojureque”——这是荒谬可笑的错误,说它的人对Clojureperhaps了解不多——有一些沟通错误?例如,let不创建“变量”。无论如何,实现这一点的标准方法是使用let。