习惯性的无操作/"传递"

时间:2014-07-28 23:52:19

标签: clojure

no-op的(最)惯用的Clojure表示是什么?即,

(def r (ref {}))
...
(let [der @r]
    (match [(:a der) (:b der)]
        [nil nil] (do (fill-in-a) (fill-in-b))
        [_ nil] (fill-in-b)
        [nil _] (fill-in-a)
        [_ _] ????))

Python有pass。我应该在Clojure中使用什么?

ETA:我主要是因为我遇到了地方(cond,例如),因为没有提供任何导致错误的地方。我意识到“大多数”时间,相当于pass是不需要的,但是当它出现时,我想知道什么是Clojuric。

3 个答案:

答案 0 :(得分:10)

我发现在这种情况下使用的关键字:default相当普遍 它具有在输出和/或日志中可识别的良好属性。这样当您看到如下日志行时:"流程已完成:默认"很明显,没有任何实际运行。这利用了Clojure中关键字真正的事实,因此默认值将被视为成功。

答案 1 :(得分:5)

Clojure中没有“陈述”,但有无数种方法可以“无所事事”。一个空的块(do),字面上表示一个“无所事事”并且评估为零。此外,我同意评论这个问题本身表明你不是以惯用的方式使用Clojure,而不管这个特定的风格问题。

答案 2 :(得分:5)

我在Clojure中可以想到的最重要的事情是命令式编程中的“无所作为”的语句将是函数,它什么都不做。有几个内置函数可以帮助你:identity是一个单一的arg函数,只返回它的参数,而constantly是一个接受一个值的高阶函数,并返回一个函数,它将接受任意数量的参数并返回该值。在需要传递函数但不希望该函数实际执行任何操作的情况下,两者都可用作占位符。一个简单的例子:

(defn twizzle [x]
  (let [f (cond (even? x) (partial * 4)
                (= 0 (rem x 3)) (partial + 2)
                :else identity)]
    (f (inc x))))

在默认情况下将此函数重写为“不执行任何操作”,尽管可能,但需要在不使用identity的情况下进行笨拙的重写。