Clojure 中的案例

Case cases in Clojure

除了 case 的恒定时间调度之外,还有什么其他原因导致我使用 case 而不是 cond condp

  1. 假设您确实在处理编译时常量,case 在语义上比 condcondp.
  2. 更能传达您的条件的性质
  3. casecondcondp.
  4. 更简洁

示例:

(cond
  (= foo 1) :one
  (= foo 2) :two
  (= foo 3) :three)

(condp = foo
  1 :one
  2 :two
  3 :three)

(case foo
  1 :one
  2 :two
  3 :three)

我无法对任何性能方面发表评论,但一如既往,这应该是您考虑的最少因素。

即使速度较慢,case 通常比 if 更具表现力:

(defn fact [n]
  (case n
    0 1
    (* n (fact (dec n)))))

...读起来比

(defn fact [n]
  (if (zero? n) 1
    (* n (fact (dec n)))))

这是一个品味问题,但 case 短语是一种更短的形式。