为什么scheme中的谓词名称都是问题的形式?
Why are the names of predicates in scheme in the form of questions?
Racket 是我学习的第一个方案方言,我还没有深入了解,但是由于方案的语法最少,我相信可以安全地假设变量名中的问号不被处理解释器与任何其他可行的字符有任何不同。
既然运行的那句不碍事,为什么scheme要用符号“?”表示 returns 真或假的函数(称为谓词)?例如,在球拍中,有一个名为 number?
的内置函数。 number?
returns 应用于任何数字(1、5、-5、2.7 等)时为真,否则为假。我相信 number?
是类似于 is_the_following_argument_a_number?
的缩写。假设这是真的,表达式 (number? 5)
转换为 (is_the_following_argument_a_number? 5)
.
在英文(写这个变量的语言)中,谓词“下面的参数是一个数字吗?”可以通过移动动词:“以下参数是一个数字”,然后提取谓词:“是一个数字”,首先将问题翻译成它的陈述形式。现在,我在说语言方面不如在编程语言方面做得最好,但我相信这是正确的。另外,很抱歉,如果这变成了一个英语问题而不是一个方案问题。
我难以理解的事实是,如果 lisp 社区将 number?
称为谓词,为什么变量名称不是英文谓词(我说变量 name 不是英语中的谓词,不是 函数类型 它在方案中不是谓词)我找到了我认为的谓词 number?
翻译成“是一个数字”,而不是整个问题“下面的参数是一个数字吗?”,只是谓词。那么,为什么 lisp 社区选择将 scheme 中的谓词命名为英语中的问题呢?我认为这是因为社区将陈述的值(真或假)误认为是 yes/no 问题的答案(是或否(很明显))。我这样想是不是错了?
这只是一个编程约定。谓词 - 意思是:那些 return true
或 false
的过程是用一个以问号结尾的名称定义的。同样,具有副作用(例如,变异状态)的过程使用以感叹号结尾的名称定义。
计算机科学中的谓词与语言语法中的谓词没有任何关系。它们都源于与真理有关,但除此之外它们是不相关的概念。 Scheme 中的谓词是一个检查某事是否为真的过程,实际上它可以有任何名称。然而,由于我们可以在名称中编码信息,它应该包含它的含义,它可以是任何单词甚至由连字符分隔的句子,以问号结尾以表明它确实是一个谓词过程。定义中的名称和用法都会在 reader 中脱颖而出,这样他们无需查看文档或实现即可知道它。
Scheme predicates in the very first Scheme report and the second looked like Common Lisp and the predicates in Scheme followed the same naming convention as Common Lisp has today. Old procedures that were in LISP 1.5 具有相同的名称但没有共同的 p 结尾,而新引入的名称有它,例如 procp
(今天称为 procedure?
)。其原因是 MacLisp 下的 Scheme 运行 并从中借用了所有枯燥的东西,而 Scheme 的魔力是词法闭包。实际上,它看起来很像 Common Lisp。
在 RRRS 或 R2RS 中,他们使所有断言结束于 ?它与 eq?
和朋友一起工作,但使用符号的算术谓词,如 <?
、=?
、<=?
等,并不成功,并在 R3RS.
在条件句中,我们将部分称为谓词、结果和替代项:
(if (< a 0) ; predicate
(- a) ; consequent
a) ; alternative
这里的谓词只是一个要么变为真要么变为假的表达式。实际上所有 Scheme 值都是允许的,只有 #f
是 false。谓词过程是一个过程,它总是 returns #t
或 #f
并且正如您所写的那样 number?
检查参数是否为数字并且 string=?
检查两个参数是否是看起来相同的字符串。该模式非常好,您可以通过查看正在使用的名称同时保持过程名称简短来想象它的作用。在演讲中,我们经常做同样的事情,比如说 "coffee?" 并得到肯定或否定的回应。它在大多数时候都有效,有时人们需要拼写出来,他们正在为他们提供一种名为咖啡的热饮。在编码中,这意味着查看过程的文档或定义。
Scheme 中还有其他命名约定。
foo->bar
是一个过程,它采用 foo
类型的参数,returns 它作为 bar
类型。 number->string
取一个数字并用字符串表示它。 (number->string 5) ; ==> "5"
foo!
可能会更改您传递给它的对象,以便比它被命名为 foo
时更快地完成工作。 set!
和 set-car!
是示例。
*variable*
来自 CL 但在 Scheme 中你可以确定它是一个全局变量。
CONSTANT
、+CONSTANT+
、+constant+
是常量变量的常用命名方式。
form*
做的事情与 form
做的类似,但不完全相同。特殊形式 let*
的作用与 let
类似,但它一次绑定一个变量。
无论您是否遵循这些代码,代码都能正常工作,但是您通过使用此约定使其更易于阅读,并且当您尝试进行比较过程时 foo=?
与 are-these-two-foo-things-equal
和 foo?
与 argument-is-a-foo
.
一样简单
请注意,其他编程语言也这样做。在 Java 中写 isFoo
和 equals
所以它也没有拼写出来。
Racket 是我学习的第一个方案方言,我还没有深入了解,但是由于方案的语法最少,我相信可以安全地假设变量名中的问号不被处理解释器与任何其他可行的字符有任何不同。
既然运行的那句不碍事,为什么scheme要用符号“?”表示 returns 真或假的函数(称为谓词)?例如,在球拍中,有一个名为 number?
的内置函数。 number?
returns 应用于任何数字(1、5、-5、2.7 等)时为真,否则为假。我相信 number?
是类似于 is_the_following_argument_a_number?
的缩写。假设这是真的,表达式 (number? 5)
转换为 (is_the_following_argument_a_number? 5)
.
在英文(写这个变量的语言)中,谓词“下面的参数是一个数字吗?”可以通过移动动词:“以下参数是一个数字”,然后提取谓词:“是一个数字”,首先将问题翻译成它的陈述形式。现在,我在说语言方面不如在编程语言方面做得最好,但我相信这是正确的。另外,很抱歉,如果这变成了一个英语问题而不是一个方案问题。
我难以理解的事实是,如果 lisp 社区将 number?
称为谓词,为什么变量名称不是英文谓词(我说变量 name 不是英语中的谓词,不是 函数类型 它在方案中不是谓词)我找到了我认为的谓词 number?
翻译成“是一个数字”,而不是整个问题“下面的参数是一个数字吗?”,只是谓词。那么,为什么 lisp 社区选择将 scheme 中的谓词命名为英语中的问题呢?我认为这是因为社区将陈述的值(真或假)误认为是 yes/no 问题的答案(是或否(很明显))。我这样想是不是错了?
这只是一个编程约定。谓词 - 意思是:那些 return true
或 false
的过程是用一个以问号结尾的名称定义的。同样,具有副作用(例如,变异状态)的过程使用以感叹号结尾的名称定义。
计算机科学中的谓词与语言语法中的谓词没有任何关系。它们都源于与真理有关,但除此之外它们是不相关的概念。 Scheme 中的谓词是一个检查某事是否为真的过程,实际上它可以有任何名称。然而,由于我们可以在名称中编码信息,它应该包含它的含义,它可以是任何单词甚至由连字符分隔的句子,以问号结尾以表明它确实是一个谓词过程。定义中的名称和用法都会在 reader 中脱颖而出,这样他们无需查看文档或实现即可知道它。
Scheme predicates in the very first Scheme report and the second looked like Common Lisp and the predicates in Scheme followed the same naming convention as Common Lisp has today. Old procedures that were in LISP 1.5 具有相同的名称但没有共同的 p 结尾,而新引入的名称有它,例如 procp
(今天称为 procedure?
)。其原因是 MacLisp 下的 Scheme 运行 并从中借用了所有枯燥的东西,而 Scheme 的魔力是词法闭包。实际上,它看起来很像 Common Lisp。
在 RRRS 或 R2RS 中,他们使所有断言结束于 ?它与 eq?
和朋友一起工作,但使用符号的算术谓词,如 <?
、=?
、<=?
等,并不成功,并在 R3RS.
在条件句中,我们将部分称为谓词、结果和替代项:
(if (< a 0) ; predicate
(- a) ; consequent
a) ; alternative
这里的谓词只是一个要么变为真要么变为假的表达式。实际上所有 Scheme 值都是允许的,只有 #f
是 false。谓词过程是一个过程,它总是 returns #t
或 #f
并且正如您所写的那样 number?
检查参数是否为数字并且 string=?
检查两个参数是否是看起来相同的字符串。该模式非常好,您可以通过查看正在使用的名称同时保持过程名称简短来想象它的作用。在演讲中,我们经常做同样的事情,比如说 "coffee?" 并得到肯定或否定的回应。它在大多数时候都有效,有时人们需要拼写出来,他们正在为他们提供一种名为咖啡的热饮。在编码中,这意味着查看过程的文档或定义。
Scheme 中还有其他命名约定。
foo->bar
是一个过程,它采用 foo
类型的参数,returns 它作为 bar
类型。 number->string
取一个数字并用字符串表示它。 (number->string 5) ; ==> "5"
foo!
可能会更改您传递给它的对象,以便比它被命名为 foo
时更快地完成工作。 set!
和 set-car!
是示例。
*variable*
来自 CL 但在 Scheme 中你可以确定它是一个全局变量。
CONSTANT
、+CONSTANT+
、+constant+
是常量变量的常用命名方式。
form*
做的事情与 form
做的类似,但不完全相同。特殊形式 let*
的作用与 let
类似,但它一次绑定一个变量。
无论您是否遵循这些代码,代码都能正常工作,但是您通过使用此约定使其更易于阅读,并且当您尝试进行比较过程时 foo=?
与 are-these-two-foo-things-equal
和 foo?
与 argument-is-a-foo
.
请注意,其他编程语言也这样做。在 Java 中写 isFoo
和 equals
所以它也没有拼写出来。