Clojure方法以*结尾

时间:2013-04-16 19:34:57

标签: clojure

*结尾的方法往往有什么共同之处?我见过一些,但不知道这是否是一个既定的命名惯例。

2 个答案:

答案 0 :(得分:2)

一般来说,我已经看到这用于区分执行相同但具有不同签名的函数,尤其是在重载会产生冲突语义的情况下。例如,list*无法表示为list的重载,因为它们以不同的方式使用变量arity。

在许多情况下(但不是全部),*表单由非*版本调用。

答案 1 :(得分:2)

除了其他答案所提到的,此约定用于非*版本是宏,而这些宏发出调用*函数的代码。即使在clojure.core中,letfn也是宏,其结果代码分别调用let*fn*函数。其他示例是sqlkorma,其中非*(wheredeleteupdate等)是宏和* 1(where*,{{1}等等是函数。

使用此模式的原因是在某些情况下使用API​​的宏版本是不可行的(除了使用eval,因为您在编译时没有信息),在这种情况下,您可以使用基于*的函数。