cli*_*zin 35 coding-style clojure naming-conventions
请注意,我不是在谈论符号名称中的耳罩,这是在Clowjure常量的约定,样式和用法中讨论的问题?而如何在Clojure中使用的`*变种名称*`命名,约定?.我正在严格地谈论有一些名为foo的函数然后调用函数foo*的实例.
小智 47
在Clojure中,它基本上意味着"foo*就像foo,但有些不同,你可能想要foo".换句话说,这意味着该代码的作者无法为第二个函数提供更好的名称,因此他们只是在它上面打了一个星.
unp*_*680 15
数学家和Haskellers可以使用他们的撇号来表示类似的对象(值或函数).相似但不完全相同.彼此相关的对象.例如,函数foo
可以是一种方式的计算,并且foo'
可以使用不同的方法执行相同的结果.也许它是缺乏想象力的命名,但它源于数学.
Lisps一般(没有任何终极原因)在符号名称中丢弃了撇号,*
有点类似于撇号.Clojure 1.3最终会通过允许名字中的撇号来解决这个问题!
如果我正确地理解了你的问题,我已经看到foo*
用于表明该函数在理论上与另一个函数等效的实例,但使用了不同的语义.就拿椎板库,它定义了喜欢的东西map*
,filter*
,take*
它的核心类型,通道.通道类似于seqs,这些函数的名称是有意义的,但它们不兼容,它们本身应该"相等".
我见过的另一个用例foo*
是用于调用带有额外参数的辅助函数的函数.fact
例如fact*
,如果递归写入,该函数可以委托给另一个参数,即累加器.你不一定要公开,fact
因为有一个额外的参数,因为调用(fact 5 100)
不会为你计算5的阶乘 - 暴露那个额外的参数是一个错误.
我也看到了宏的相同风格.宏foo
扩展为函数调用foo*
.
正常的 let 绑定(let ((...)))
创建单独的变量
let star 绑定(let* ((...)))
按顺序创建变量,以便可以像这样互相计算
(let* ((x 10) (y (+ x 5)))
Run Code Online (Sandbox Code Playgroud)
我可能有点偏离事实,但请参阅Common Lisp 中的 LET 与 LET*以了解更多详细信息
编辑:我不确定这在 Clojure 中如何反映,我才开始阅读《Programming Clojure》,所以我还不知道