显然,Racket / Scheme中的一个约定是向执行变异的函数名附加一个感叹号。例如,在Racket中,set!
,box-set!
,vector-set!
等。某些功能会产生副作用,例如print
,但由于这些副作用是&#34 ;无害,"我明白为什么他们通常不附带感叹号。
但是,这种惯例是任意违反的。例如,async-channel-get
和async-channel-put
清楚地执行变异,但他们没有#34;突变标记"附在他们的名字上。通过指出这些是渠道,显然是基于突变的,这可以在某种程度上证明是正确的,所以"!"将是多余的。
但这不是一切有效的理由。 Racket的WebSockets library提供了ws-send!
和ws-close!
个功能,两者都带有明显的标记,但ws-recv
没有没有!这只是一个孤立违反公约,还是有一些规则?
我主要是要确定我应该如何在自己的代码中命名函数。我应该何时使用感叹号,何时不应该?我认识到它只是一个惯例,而不是一个规则,它可能会有些不一致,但我仍然想知道最佳实践是什么。
答案 0 :(得分:1)
我不认为#!racket有自己的命名约定,但根据this R5RS page,您可以阅读:
导致副作用的程序和句法形式的名称 以感叹号结束(!)。这些包括集!和 矢量集!执行输入或输出的程序在技术上导致 副作用,但他们的名字是这个规则的例外。
在Scheme wiki variable naming convention中,procedure!
表示“重大副作用”。 IMO意味着副作用是程序的主角,如set-car!
和set!
,而read
返回的值可能是读取的主要特征?