在Racket / Scheme中考虑具有副作用的函数的惯例是什么?

时间:2014-12-07 20:52:23

标签: scheme racket convention

显然,Racket / Scheme中的一个约定是向执行变异的函数名附加一个感叹号。例如,在Racket中,set!box-set!vector-set!等。某些功能会产生副作用,例如print,但由于这些副作用是&#34 ;无害,"我明白为什么他们通常不附带感叹号。

但是,这种惯例是任意违反的。例如,async-channel-getasync-channel-put清楚地执行变异,但他们没有#34;突变标记"附在他们的名字上。通过指出这些是渠道,显然是基于突变的,这可以在某种程度上证明是正确的,所以"!"将是多余的。

但这不是一切有效的理由。 Racket的WebSockets library提供了ws-send!ws-close!个功能,两者都带有明显的标记,但ws-recv没有没有!这只是一个孤立违反公约,还是有一些规则?

我主要是要确定我应该如何在自己的代码中命名函数。我应该何时使用感叹号,何时不应该?我认识到它只是一个惯例,而不是一个规则,它可能会有些不一致,但我仍然想知道最佳实践是什么。

1 个答案:

答案 0 :(得分:1)

我不认为#!racket有自己的命名约定,但根据this R5RS page,您可以阅读:

  

导致副作用的程序和句法形式的名称   以感叹号结束(!)。这些包括集!和   矢量集!执行输入或输出的程序在技术上导致   副作用,但他们的名字是这个规则的例外。

Scheme wiki variable naming convention中,procedure!表示“重大副作用”。 IMO意味着副作用是程序的主角,如set-car!set!,而read返回的值可能是读取的主要特征?