在Clojure和其他Lisp方言的函数名末尾使用星号的惯例是什么?

cli*_*zin 35 coding-style clojure naming-conventions

请注意,我不是在谈论符号名称中的耳罩,这是在Clowjure常量的约定,样式和用法中讨论的问题如何在Clojure中使用的`*变种名称*`命名,约定?.我正在严格地谈论有一些名为foo的函数然后调用函数foo*的实例.

小智 47

在Clojure中,它基本上意味着"foo*就像foo,但有些不同,你可能想要foo".换句话说,这意味着该代码的作者无法为第二个函数提供更好的名称,因此他们只是在它上面打了一个星.

  • 特别是,"foo*"通常是以语法上令人讨厌的方式完成某些元编程任务的函数,而"foo"是一个在其上提供更多语法上令人愉悦的抽象的宏.这样可以最大限度地减少宏中的逻辑量,并尽可能地将其推送到函数中,通常更容易理解和调试,同时仍然在其语法转换功能上保持最小的宏. (15认同)

unp*_*680 15

数学家和Haskellers可以使用他们的撇号来表示类似的对象(值或函数).相似但不完全相同.彼此相关的对象.例如,函数foo可以是一种方式的计算,并且foo'可以使用不同的方法执行相同的结果.也许它是缺乏想象力的命名,但它源于数学.

Lisps一般(没有任何终极原因)在符号名称中丢弃了撇号,*有点类似于撇号.Clojure 1.3最终会通过允许名字中的撇号来解决这个问题!


apg*_*apg 8

如果我正确地理解了你的问题,我已经看到foo*用于表明该函数在理论上与另一个函数等效的实例,但使用了不同的语义.就拿椎板库,它定义了喜欢的东西map*,filter*,take*它的核心类型,通道.通道类似于seqs,这些函数的名称是有意义的,但它们不兼容,它们本身应该"相等".

我见过的另一个用例foo*是用于调用带有额外参数的辅助函数的函数.fact例如fact*,如果递归写入,该函数可以委托给另一个参数,即累加器.你不一定要公开,fact因为有一个额外的参数,因为调用(fact 5 100)不会为你计算5的阶乘 - 暴露那个额外的参数是一个错误.

我也看到了宏的相同风格.宏foo扩展为函数调用foo*.

  • 来自http://dev.clojure.org/display/design/Library+Coding+Standards:`当函数可以完成工作时,不要使用宏.如果宏对于易用性很重要,那么也要公开函数版本.未解决的问题:这里应该有一个命名约定吗?很多地方都使用"foo"和"foo*" (2认同)

Jim*_*mmy 1

正常的 let 绑定(let ((...)))创建单独的变量

let star 绑定(let* ((...)))按顺序创建变量,以便可以像这样互相计算

(let* ((x 10) (y (+ x 5)))
Run Code Online (Sandbox Code Playgroud)

我可能有点偏离事实,但请参阅Common Lisp 中的 LET 与 LET*以了解更多详细信息

编辑:我不确定这在 Clojure 中如何反映,我才开始阅读《Programming Clojure》,所以我还不知道

  • 实际上,Clojure 中的情况正好相反。 (5认同)