在Clojure中你可以写:
(cond (= 1 2) 1
:else 5)
在Scheme中,等价物是:
(cond ((= 1 2) 1)
(else 5))
:else 5
语法与(else 5)
不一致。在Clojure中以这种看似不一致的方式实现else语法的原因是什么?
答案 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中,如果需要分组,例如在fn
或let
绑定中,您将使用[]
代替。
Rich在最近的一次采访here中讨论了改变背后的部分原因。简而言之,它有助于使代码更容易读取,因为您不必花时间弄清楚代表什么代理。