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

时间:2016-08-16 15:24:28

标签: scheme naming-conventions

球拍是我正在学习的方案的第一个方言,而我并不是那么远,但是由于方案的最小语法,我认为可以安全地假设变量名中的问号不被解释器处理不同于任何其他可行的角色。

随着句子的运行,为什么方案使用符号“?”来表示返回true或false的函数(称为谓词)?例如,在球拍中,有一个名为number?的内置函数。应用于任何数字(1,5,5,2.7等)时,number?返回true,否则返回false。我认为number?is_the_following_argument_a_number?的缩写。假设情况属实,表达式(number? 5)会转换为(is_the_following_argument_a_number? 5)

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

我无法理解的事实是,如果lisp社区调用number?一个谓词,为什么变量名称不是英语的谓词(我说变量 name 不是英语的谓语,不是类型的函数它在方案中不是谓词)我发现了我认为我认为number?翻译成的谓词,如是“是一个数字”,而不是整个问题“下面的参数是一个数字?”,只是谓词。那么,为什么lisp社区选择将方案中的谓词命名为英语问题?我认为这是因为社区错误的陈述(真或假)的答案是肯定/否定问题(是或否(显然))。我觉得这个错了吗?

2 个答案:

答案 0 :(得分:2)

计算机科学中的谓词与语言语法中的谓词没有任何关系。它们都源于与thruth有关,但在其他方面它们是无关的概念。 Scheme中的谓词是一个检查某些内容是否为真的过程,实际上它可以有任何名称。然而,因为我们可以在名称中编码信息,它应包含的内容是什么,它可以是由连字符分隔的任何单词或甚至句子,以问号结尾以表明它确实是谓词程序。定义中的名称和用法都会向读者展示,以便他们在不查看文档或实现的情况下了解它。

非常Scheme predicatesfirst Scheme report中的

the second看起来像Common Lisp,并且Scheme中的谓词遵循与Common Lisp今天相同的命名约定。 LISP 1.5中的旧程序具有相同的名称,没有共同的p结尾,而新引入的程序具有它,如procp(今天称为procedure?)。这样做的原因是Scheme在MacLisp下运行并从中借用了所有沉闷的东西,而它是词汇封闭,这是Scheme的神奇之处。实际上,它看起来很像Common Lisp。

在RRRS或R2RS中,他们的所有谓词都以?它与eq?和朋友合作,但使用符号的算术谓词,如<?=?<=?等,并不成功,并在{ {3}}

在条件中,我们称之为部分谓词,后果和替代:

(if (< a 0) ; predicate 
    (- a)   ; consequent 
    a)      ; alternative

这里谓词只是一个转为true或false的表达式。实际上,所有Scheme值都是允许的,只有#f为false。谓词过程是一个始终返回#t#f的过程,当你写number?时,检查参数是否为数字,string=?检查是否为2参数是看起来相同的字符串。模式非常好,您可以通过查看正在使用的名称同时保持过程名称简短来想象它的作用。在演讲中我们经常做同样的事情,比如说“咖啡?”并获得积极或消极的回应。它大部分时间都有效,有时候人们需要说明它们正在为它们提供一种名为咖啡的热饮料。在编码中意味着查看过程的文档或定义。

Scheme中还有其他命名约定。

foo->bar是一个过程,它接受foo类型的参数,并将其作为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中,写一个isFooequals,所以它也没有拼写出来。

答案 1 :(得分:1)

这只是一个编程约定。谓词 - 含义:返回truefalse的那些过程定义为以问号结尾的名称。类似地,具有副作用的程序(例如,变异状态)使用以感叹号结尾的名称定义。