SICP练习4.5

时间:2017-12-22 19:08:10

标签: scheme computer-science sicp

我正在学习SICP并进行编程练习。我对练习4.5有疑问。练习4.5是:

  

Scheme允许cond子句(<test> => <recipient>)的附加语法。如果<test>计算为真值,则评估<recipient>。它的价值必须是一个论证的过程;然后,对<test>的值调用此过程,并将结果作为cond表达式的值返回。例如:

(cond 
  ((assoc 'b '((a 1) (b 2))) => cadr)
  (else false))

如上所示,如果<test>为真,则cond子句的值应为(<recipient> <test>)(即

  

然后评估<recipient>。它的价值必须是一个论证的过程;然后在<test>的值上调用此过程,并返回结果...

但是当我在互联网上搜索解决方案时,我发现的几乎所有内容都是(list (extended-cond-recipient first) (extended-cond-test first))这是一个由<recipient><test> 组成的列表,不是函数调用。 我该怎么办?它困扰了我好久......

1 个答案:

答案 0 :(得分:2)

The Core of the Evaluator中,在“特殊表格”下写着:

  

•案例分析(cond)转换为if表达式的嵌套,然后进行评估。

即,首先完成程序级别的转换,并且仅在此转换之后才评估结果表达式。转换由函数cond->if完成,不评估 cond表达式,只在包含多个if的嵌套列表中对其进行转换。这可以在eval函数的定义中看出,其中有以下情况:

((cond? exp) (eval (cond->if exp) env))

在您看到的解决方案中,cond->if函数被修改,以便它转换列表中的=>语法(正如您正确观察到的),一个包含该函数的列表元素及其作为第二个元素的参数,该列表将在解释器的后续步骤中正确计算