为什么:否则不是(其他)在clojure?

时间:2011-06-12 12:13:09

标签: clojure

在Clojure中你可以写:

(cond (= 1 2) 1 
      :else 5)

在Scheme中,等价物是:

(cond ((= 1 2) 1)
       (else 5))

:else 5语法与(else 5)不一致。在Clojure中以这种看似不一致的方式实现else语法的原因是什么?

4 个答案:

答案 0 :(得分:36)

:else实际上是一个聪明的伎俩:

  • cond期望条件/值对 - 并且:else只是Clojure中“truthy”的值,因此它可以保证满足条件。 (除了null或false之外的任何东西都算作“真相”)。如果你愿意的话,你可以同样使用“:donkey”作为保证的真实条件值。
  • 然而,:还向人类读者传达意义(即如果其他条件都不匹配,则该条件将被执行

所以它真的只是一个适用于cond表达式的约定,对人类读者有意义。

答案 1 :(得分:27)

我认为(else 5)不太一致。 (cond ...)个参数表示为条件 - 值对。 :else value是一致的,因为:else只是一个约定 - 它起作用,因为:else只是一个始终为真的表达式。 :else根本没有特殊规则。

答案 2 :(得分:3)

有很多原因;主要是我认为这是因为cond是作为if周围的宏实现的。另一方面,在方案else中,t只是此上下文中{{1}}的同义词;它不是一个函数调用,为什么要让它看起来像一个?

答案 3 :(得分:3)

99%的时间,Clojure中的parens暗示函数或宏调用。这与使用parens进行分组的其他一些Lisps形成对比。在Clojure中,如果需要分组,例如在fnlet绑定中,您将使用[]代替。

Rich在最近的一次采访here中讨论了改变背后的部分原因。简而言之,它有助于使代码更容易读取,因为您不必花时间弄清楚代表什么代理。