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。
答案 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
的情况下进行笨拙的重写。