为什么scheme中的谓词名称以问题的形式出现?

Vit*_*you 0 scheme naming-conventions

Racket 是我正在学习的第一种方案方言,而且我还没有那么远,但是由于方案的语法最少,我相信可以安全地假设解释器对变量名中的问号的处理与任何不同其他可行的字符。

有了这个句子,为什么方案使用符号“?” 表示返回真或假的函数(称为谓词)?例如,在球拍中,有一个名为number?. number?应用于任何数字(1、5、-5、2.7 等)时返回 true,否则返回 false。我相信这number?是类似于is_the_following_argument_a_number?. 假设这是真的,表达式(number? 5)将转换为(is_the_following_argument_a_number? 5)

在英语(此变量的编写语言)中,谓词“以下参数是数字吗?” 可以通过先移动动词:“the following argument is a number”,然后提取谓词:“is a number”,将问题翻译成陈述句形式找到。现在,我不像我在编程语言那样擅长语言,但我相信这是正确的。另外,对不起,如果这变成了一个英语问题而不是一个计划问题。

我难以理解的是,如果 lisp 社区调用number?谓词,为什么变量名不是英语谓词(我说变量不是英语谓词,不是它的函数类型) in scheme 不是谓词)我发现我认为我认为number?翻译成的谓词是“是一个数字”,而不是整个问题“下面的参数是一个数字吗?”,只是谓词。那么,为什么 lisp 社区选择将方案中的谓词命名为英语中的问题?我认为这是因为社区错误地将陈述的价值(真或假)作为是/否问题的答案(是或否(显然))。我这样想有错吗?

Syl*_*ter 5

计算机科学中的谓词与语言语法中的谓词没有任何关系。它们都源自与 thruth 的关系,但除此之外它们是不相关的概念。Scheme 中的谓词是一个过程,用于检查某事是否为真,实际上它可以有任何名称。然而,由于我们可以在名称中编码信息,因此它应该包含它的内容,可以是任何单词,甚至可以是由连字符分隔的句子,以问号结尾以表明它确实是一个谓词过程。定义中的名称和用法都会让读者醒目,以便他们无需查看文档或实现就知道它。

在第一个 Scheme 报告第二个报告中的Scheme 谓词看起来像Common Lisp,并且 Scheme 中的谓词遵循与今天的 Common Lisp 相同的命名约定。LISP 1.5中的旧过程具有相同的名称,但没有公共 p 结尾,而新引入的过程具有它,例如procpprocedure?今天称为)。这样做的原因是 Scheme 在 MacLisp 下运行并从中借用了所有枯燥的东西,而词法闭包是 Scheme 的魔力。实际上,它看起来很像 Common Lisp。

在 RRRS 或 R2RS 中,它们都以 ? 并与工作eq?和朋友,但算术谓词所使用的符号,如<?=?<=?,等,没有成功,并在被拆除R3RS

在条件中,我们称部分谓词、结果和替代:

(if (< a 0) ; predicate 
    (- a)   ; consequent 
    a)      ; alternative
Run Code Online (Sandbox Code Playgroud)

这里的谓词只是一个要么变成真要么变成假的表达式。实际上所有 Scheme 值都是允许的,只有#ffalse。谓词过程是一个始终返回#t或的过程,#f正如您编写的那样,number?检查参数是否为数字和string=?检查两个参数是否是看起来相同的字符串。该模式非常好,您可以通过查看正在使用的名称同时保持过程名称的简短来想象它的作用。在演讲中,我们也经常这样做,比如说“咖啡?” 并得到正面或负面的回应。它在大多数情况下都有效,有时人们需要说明他们正在为他们提供一种名为咖啡的热饮料。在编码中,这意味着查看过程的文档或定义。

Scheme 中还有其他命名约定。

foo->bar是一个过程,它接受一个foo类型的参数并将它作为一个bar类型返回。number->string接受一个数字并对其进行字符串表示。(number->string 5) ; ==> "5"

foo!可能会更改您传递给它的对象,以便比命名时稍快地完成工作fooset!并且set-car!是例子。

*variable* 来自 CL 但在 Scheme 中,您可以确定它是一个全局变量。

CONSTANT, +CONSTANT+,+constant+是被视为常量的变量的常见命名。

form*做一些类似于什么form,但不完全一样。特殊形式let*做类似的事情,let但它一次绑定一个变量。

代码工作是否遵循这些或没有,但你更容易地使用这种惯例阅读,当你尝试进行somparison程序foo=?也很容易理解的are-these-two-foo-things-equalfoo?是一样简单argument-is-a-foo

请注意,其他编程语言也这样做。在 Java 中一个写isFooequals所以它也没有在那里拼写。