1

问候,我是新来的所以请照顾我。

Simply Scheme中的练习6.1有如下表达式:

(cond (empty? 3)
      (square 7)
      (else 9))

我的想法是它应该评估(正方形 7)并返回它。(empty? 3) 被评估(返回原子 - 与其他原子和列表一起尝试,同样的处理)。

我很困惑。

我知道的:

  1. Scheme中所有不为假的都是真的。如果 3 为真且不为空 (#f),为什么 cond 表达式返回 (empty?3)?
  2. 对 cond 表达式的第一个参数进行求值,如果它为真,则返回 #t、定义的值或 #undefined 取决于上下文。如果为 false,它将继续连续评估 cond 参数,直到它这样做(或找不到合适的返回值)然后退出 cond。

我不知道的是:

  1. (空?3)自己返回#f。为什么 cond 在这里终止而不评估(正方形 7)?
  2. 为什么在 cond 中对 (empty?3) 的评估返回原子,而不是 #t 或 #f?

我正在使用带有 Slib 的 SCM 以及加载了简单方案(simply.scm、functions.scm、ttt.scm、match.scm、database.scm)提供的其他库。

空的?现在,simple.scm 中的定义超出了我的计划范围。

4

2 回答 2

2

cond表格是这样的:

(cond (something-to-check-for-truthiness value-if-truthiness-succeed)
        ...other checks in the same format as above  )

现在,如果您将代码转换为这种格式。 empty?即只有空函数(不是它的调用)代替something-to-check-for-truthiness并且函数始终是真值,因此3返回数字,该数字在插槽之后empty?并适合value-if-truthiness-succeed插槽。因此,根本没有调用empty?函数。

于 2013-04-22T11:30:28.363 回答
1

这不是 cond 所做的。cond 接受一个或多个参数,每个参数必须是一个方案表达式列表。

(cond (#t)) 是有效的 cond 语句。

它计算第一个表达式,如果为真,则计算该列表中尽可能多的附加 s-epressions,并返回最后一个计算的表达式的值。

(cond (#t 1 2 3 4 (if (number? 0) "Yeah, sanity!" "It rubs Lotion on it's skin"))) 是一个有效的 cond 语句

于 2013-05-01T01:28:04.703 回答