使用“?”是一种不好的做法在球拍方法名称中?

Is a bad practice to use "?" in a Racket method name?

上周我参加了一次球拍考试,我用问号符号命名了一些考试方法(例如“属于?”,“发烧?”等...)。但是当他们给我结果时,我的一位教授告诉我,使用“?”是一种不好的做法。在我使用它的方法中,我不明白,因为球拍中的很多方法最初都是这样调用的。

所以我的问题是:这真的是一种不好的做法吗?如果这是一种不好的做法,为什么球拍会使用它?

根据 Racket 代码库自己的 Style Guide 谓词和布尔值函数应该以 ? 结尾。 belongs?has-fever? 似乎符合这个要求,所以我怀疑这取决于你教授的口味。

在 Scheme 和 Racket 中,predicate 过程以 ? 结束是惯用的。由于与此类程序相关的历史和惯例存在某些期望,因此偏离该惯例被认为是不好的做法。 Scheme 标准甚至用语言形式化了这种做法 (R6RS 6.7 Naming Conventions):

By convention, the names of predicates—procedures that always return a boolean value—end in “?” when the name contains any letters; otherwise, the predicate's name does not end with a question mark.

现在,在 Scheme 和 Racket 中,predicate 是一个总是 return 布尔值的过程,即 #t#f。如果批评下的程序并不总是 return #t#f,那么它们就不适合谓词的命名约定模型。如果情况并非如此,那么在没有看到实际定义的情况下很难知道它们是如何出现不足的。

member 是一个可以用作“谓词”的 Racket 过程的示例,但实际上不是约定俗成的谓词,也不是规范的语言。如果查找的值不是列表的成员,则此过程 returns #f,但如果它是列表的成员,则 returns 以查找的值开头的列表的尾部列表(此列表尾部是一个真值,但不是布尔值 #t)。请注意 member 不以问号结尾。如果 OP belongs? 的行为类似于 member,那么教授将此命名归类为不良做法当然是正确的。

请注意,其他 lisp 对谓词有不同的约定。例如,在 Common Lisp 中,在谓词名称中使用 ? 不是 惯例(并且不被认为是一种好的做法)。