【问题标题】:If and cond as special formsif 和 cond 作为特殊形式
【发布时间】:2018-07-30 16:13:05
【问题描述】:

考虑SICP的这两段:

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

...

这使用特殊形式 if ,这是一种受限的条件类型 案例分析中恰好有两个案例时可以使用。

在这种情况下类型是什么意思(条件的限制类型)?是什么意思:

  • “if”是一种“cond”?因为句子陈述了“有一种特殊形式”,所以只有一种特殊形式,因为“if”是“cond”的一种。
  • “if”和“cond”都不相关。它们都是有条件的。如果这是正确的,为什么这句话说“有一个特殊的形式”就像它只有一个一样?

【问题讨论】:

  • 有一种特殊的形式用于一般案例分析,支持多种案例——它被称为 COND。当只有两种情况时,有一个更简单的特殊形式:IF。
  • @Rainer Joswig 谢谢。这有点跑题了。关于你所说的如果。 “只有两种情况:” - 但为什么 (if (> 2 3) #t) 有效?这只是一种情况? (if ( 2 3) #t) 什么也不返回。
  • 在一些早期的方案中,没有否定子句的 IF 不是基本语法。一般在 Scheme 中,如果值为 false 且未提供第二个子句,则 IF 表达式的值未指定。这意味着在 Scheme 中它通常会返回一些东西,但它返回的内容是未指定的。在 Common Lisp 中,它被指定返回 NIL。

标签: scheme lisp sicp


【解决方案1】:

“ if [is] 一种受限制的条件类型”,我相信“条件”并不具体意味着cond;它通常表示“条件语句/表达式”。

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

特殊形式由解释器(编译器)自己专门处理。

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

所以if 是有条件的; cond 是有条件的; cond 可以有任意数量的子句; if 必须恰好有两个(或一个或两个,取决于标准)子句;其余的只是英语。 :)

【讨论】:

  • 谢谢。这有点跑题了。关于你所说的如果。 “if 必须正好有两个子句;” - 但为什么 (if (> 2 3) #t) 有效?这只是一种情况? (if ( 2 3) #t) 什么也不返回。
  • 这取决于语言/实现。我相信它在 Common Lisp 中是合法的,但在 Scheme 中却不是。你正在使用什么实现? -- 刚签入Racket,在#lang racket下无效,但在#lang r5rs下确实成功返回“nothing”。
  • 我正在使用 r5rs。那么这是否意味着我们只允许在 r5rs 中使用 1 个案例?
  • 是的。但返回值是“未指定”,因此不应使用。这样的if 只会用于它的“副作用”,而不是它的返回值。例如,在 #lang r5rs 下的 DrRacket 中运行 (define x (if #f 1)) (display x) 打印 #<void>
  • 通常在语言标准中,他们只是选择哪个是原语,哪个是从另一个派生的,实现总是可以选择将他们喜欢的任何东西作为原语实现,他们经常这样做以加快实现速度. Common Lisp 和 Scheme 都将 cond 定义为宏/派生,因此 if 是原语,而 McCarthy 论文只有 cond,因此它是 Lisp 中的原始条件。如果谓词为#f 并且表单中没有替代表达式,则从 R6RS 实现可以返回它们看起来合适的任何内容。
猜你喜欢
  • 2016-02-01
  • 1970-01-01
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
  • 2016-06-21
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多