以*
结尾的方法往往有什么共同之处?我见过一些,但不知道这是否是一个既定的命名惯例。
答案 0 :(得分:2)
一般来说,我已经看到这用于区分执行相同但具有不同签名的函数,尤其是在重载会产生冲突语义的情况下。例如,list*
无法表示为list
的重载,因为它们以不同的方式使用变量arity。
在许多情况下(但不是全部),*
表单由非*
版本调用。
答案 1 :(得分:2)
除了其他答案所提到的,此约定用于非*版本是宏,而这些宏发出调用*函数的代码。即使在clojure.core
中,let
和fn
也是宏,其结果代码分别调用let*
和fn*
函数。其他示例是sqlkorma,其中非*(where
,delete
,update
等)是宏和* 1(where*
,{{1}等等是函数。
使用此模式的原因是在某些情况下使用API的宏版本是不可行的(除了使用eval,因为您在编译时没有信息),在这种情况下,您可以使用基于*的函数。