Scheme If和cond作为特殊形式

Scheme If和cond作为特殊形式,scheme,lisp,sicp,Scheme,Lisp,Sicp,从以下方面考虑这两段: 这种结构称为案例分析,有一种特殊的形式 在Lisp中,用于记录此类案例分析。它被称为cond(cond) 表示“有条件”),其用法如下: 它使用特殊形式if,一种限制类型的条件 在案例分析中正好有两个案例时可以使用 在此上下文中,“类型”是什么意思(条件的限制类型)?这是否意味着: “如果”是一种“条件”?因为这个句子说“有一种特殊形式”,所以只有一种特殊形式,因为“如果”是“条件”的一种类型 “如果”和“条件”都是不相关的。它们都是条件句。如果这是正确的,为什么这句

从以下方面考虑这两段:

这种结构称为案例分析,有一种特殊的形式 在Lisp中,用于记录此类案例分析。它被称为cond(cond) 表示“有条件”),其用法如下:

它使用特殊形式if,一种限制类型的条件 在案例分析中正好有两个案例时可以使用

在此上下文中,“类型”是什么意思(条件的限制类型)?这是否意味着:

  • “如果”是一种“条件”?因为这个句子说“有一种特殊形式”,所以只有一种特殊形式,因为“如果”是“条件”的一种类型
  • “如果”和“条件”都是不相关的。它们都是条件句。如果这是正确的,为什么这句话说“有一种特殊形式”,好像它只是一种形式
在“ 
中,如果
[是]一种受限制的条件类型”,我相信“条件”并不是特别指条件;一般来说,它的意思是“条件语句/表达式”

所以有两个,
cond
if
。每一个都可以用另一个来定义,因此一个给定的实现可以选择只有其中一个作为原语,用它来定义另一个;或者,实现可以选择将它们都作为原始的特殊形式

特殊表单由解释器(编译器)自己专门处理

宏也可以用于此。它们将不会由解释器本身处理,而是由其宏处理机制处理

如果是一个条件,那么
cond
是一个条件
cond
可以有任意数量的子句<代码>如果
必须有两个(或一个或两个,取决于标准)条款;其余的都是英语。:)

在“&hairsp;
中,如果
[是]一种限制性的条件类型”,我相信“条件”并不是指具体的
cond
;一般来说,它的意思是“条件语句/表达式”

所以有两个,
cond
if
。每一个都可以用另一个来定义,因此一个给定的实现可以选择只有其中一个作为原语,用它来定义另一个;或者,实现可以选择将它们都作为原始的特殊形式

特殊表单由解释器(编译器)自己专门处理

宏也可以用于此。它们将不会由解释器本身处理,而是由其宏处理机制处理


如果是一个条件,那么
cond
是一个条件
cond
可以有任意数量的子句<代码>如果
必须有两个(或一个或两个,取决于标准)条款;其余的都是英语。:)

有一种支持多个案例的通用案例分析的特殊形式,称为COND。当只有两种情况时,有一种更简单的特殊形式:IF。@rainerjoswig谢谢。这有点离题了。关于你所说的如果。“只有两种情况:”-但为什么(如果(>23)#t)有效?这只是一个案例?(if(<23)#t)按预期返回#t,但(if(>23)#t)完全不返回任何内容。在一些早期方案中,不带否定子句的if不是基本语法。通常在Scheme中,如果值为false且未提供第二个子句,则if表达式的值未指定。这意味着在Scheme中,它通常返回一些东西,但未指定返回的内容。在Common Lisp中,它被指定为返回NIL。有一种特殊的形式用于支持多个案例的一般案例分析,称为COND。当只有两种情况时,有一种更简单的特殊形式:IF。@rainerjoswig谢谢。这有点离题了。关于你所说的如果。“只有两种情况:”-但为什么(如果(>23)#t)有效?这只是一个案例?(if(<23)#t)按预期返回#t,但(if(>23)#t)完全不返回任何内容。在一些早期方案中,不带否定子句的if不是基本语法。通常在Scheme中,如果值为false且未提供第二个子句,则if表达式的值未指定。这意味着在Scheme中,它通常返回一些东西,但未指定返回的内容。在Common Lisp中,指定返回NIL.Thank。这有点离题了。关于你所说的如果。“if必须正好有两个子句;”—但为什么(if(>23)#t)有效?这只是一个案例?(if(<23)#t)按预期返回#t,但(if(>23)#t)完全不返回任何内容。这取决于语言/实现。它在Common Lisp中是合法的,但我相信在Scheme中是不合法的。您正在使用什么实现?--我刚刚签入了Racket,它在
#lang Racket
下无效,但在
#lang r5rs
下确实成功返回“nothing”。我正在使用r5rs。那么,这是否意味着我们只允许在R5R中的1种情况下使用if?是的。但返回值为“未指定”,因此不应使用。这样的
if
将仅用于其“副作用”,而不是其返回值。e、 例如,运行
(定义x(如果f 1))(显示x)
打印
,在DrRacket的
#lang r5rs
下。在语言标准中,他们通常只选择哪一个是原语,哪一个是从另一个派生的,实现总是可以选择实现任何他们喜欢的原语,并且他们通常会做一些事情来加快实现速度。通用Lisp和Scheme都将
cond
定义为宏/派生,因此
if
是原语,而麦卡锡论文中只有
cond
,因此它是Lisp中的原始条件。如果谓词是
#f
,并且表单中没有其他表达式,那么从R6RS实现可以返回任何看起来合适的结果。谢谢。这有点离题了。关于你所说的如果。“如果必须有exac