4

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

4

2 回答 2

2

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

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

于 2013-04-16T20:05:52.850 回答
2

除了其他答案提到的内容外,此约定用于非 * 版本是宏并且这些宏发出调用 * 函数的代码的情况。即使在clojure.core,let和中,fn也是其结果代码分别调用let*fn*函数的宏。其他示例是sqlkorma,其中非 * (where,deleteupdate)是宏, * (where*delete*)是函数。

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

于 2013-04-17T04:23:23.767 回答