Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';在Clojure和其他Lisp方言中,函数名末尾使用星号的惯例是什么?_Clojure_Coding Style_Naming Conventions - Fatal编程技术网

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

什么';在Clojure和其他Lisp方言中,函数名末尾使用星号的惯例是什么?,clojure,coding-style,naming-conventions,Clojure,Coding Style,Naming Conventions,请注意,我不是在谈论符号名称中的耳罩,这是和讨论的一个问题。严格来说,我指的是一个名为foo的函数调用一个函数foo*一个普通的let绑定(let(…)并行创建单独的变量 let-star绑定(let*(…))按顺序创建变量,以便可以像这样相互计算 (let* ((x 10) (y (+ x 5))) 我可能有点偏离基准,但请看更多细节 编辑:我不确定这在Clojure中是如何反映的,我只是开始阅读编程Clojure,所以我还不知道如果我正确理解了你的问题,我已经看到过使用foo*的实例,表明

请注意,我不是在谈论符号名称中的耳罩,这是和讨论的一个问题。严格来说,我指的是一个名为foo的函数调用一个函数foo*

一个普通的let绑定
(let(…)
并行创建单独的变量

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

(let* ((x 10) (y (+ x 5)))
我可能有点偏离基准,但请看更多细节


编辑:我不确定这在Clojure中是如何反映的,我只是开始阅读编程Clojure,所以我还不知道

如果我正确理解了你的问题,我已经看到过使用
foo*
的实例,表明函数在理论上与另一个函数等价,但使用不同的语义。以库为例,它为核心类型channels定义了
map*
filter*
Take*
。通道与seqs非常相似,因此这些函数的名称有意义,但它们的兼容性不够,因此它们本身应该是“相等”的

我看到的
foo*
样式的另一个用例是调用带有额外参数的辅助函数的函数。例如,
fact
函数可能会委托给
fact*
,该函数接受另一个参数,即累加器(如果以递归方式写入)。您不一定要在
事实
中公开额外的参数,因为调用
(事实5 100)
不会为您计算5的阶乘——公开额外的参数是一个错误


我也见过宏的相同样式。宏
foo
扩展为对
foo*
的函数调用

在Clojure中,它的基本意思是“foo*像foo,但有点不同,你可能想要foo”。换句话说,这意味着代码的作者无法为第二个函数找到更好的名称,所以他们只是在上面加了一颗星星。

数学家和Haskeller可以用撇号来表示类似的对象(值或函数)。相似但不完全相同。相互关联的对象。例如,函数
foo
可以以一种方式进行计算,而
foo'
将以不同的方法得到相同的结果。也许这是一个缺乏想象力的命名,但它植根于数学


Lisp通常(没有任何终端原因)会在符号名中丢弃撇号,
*
有点像撇号。Clojure 1.3最终将通过在名称中允许撇号来解决这个问题

你的意思是像
(let((x5)(y10))
(let*((x5)(y10))
这样的语句?假设我的评论的答案是肯定的,请看@Jimmy:谢谢链接。并行与非并行绑定是任何foo/foo*函数之间的唯一区别吗?或者还有其他区别可以区分这两者吗?我不确定这种区别是否也适用于Clojure…在Clojure中,让我们使用顺序绑定。from:
当函数可以执行此任务时,不要使用宏。如果宏对于易用性很重要,则还应公开函数版本。开放性问题:这里应该有命名约定吗?很多地方使用“foo”和“foo*”
尤其是,“foo*”通常是一个以语法上令人讨厌的方式完成某些元编程任务的函数,“foo”是一个宏,它在语法上提供了一个更令人愉悦的抽象。这样可以最大限度地减少宏中的逻辑量,并将尽可能多的逻辑推送到函数中,在函数中通常更易于理解和调试,同时仍然在其顶部保留一个最小的宏以实现语法转换功能。实际上,在Clojure中正好相反。