我正在学习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>
组成的列表,不是函数调用。
我该怎么办?它困扰了我好久......
答案 0 :(得分:2)
在The Core of the Evaluator中,在“特殊表格”下写着:
•案例分析(cond)转换为if表达式的嵌套,然后进行评估。
即,首先完成程序级别的转换,并且仅在此转换之后才评估结果表达式。转换由函数cond->if
完成,不评估 cond表达式,只在包含多个if
的嵌套列表中对其进行转换。这可以在eval函数的定义中看出,其中有以下情况:
((cond? exp) (eval (cond->if exp) env))
在您看到的解决方案中,cond->if
函数被修改,以便它转换列表中的=>
语法(正如您正确观察到的),一个包含该函数的列表元素及其作为第二个元素的参数,该列表将在解释器的后续步骤中正确计算。