我正在学习SICP并做编程练习。我有一个关于练习4.5的问题。练习4.5是:
方案允许为
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>组成的列表,不是函数调用。我该怎么办?它已经困扰了我很长时间..。
发布于 2017-12-22 20:05:46
在评价者的核心中,在“特殊表格”下写着:
将案例分析(cond)转换为if表达式的集合,然后进行评估。
也就是说,首先在程序级别上完成转换,并且只有在此转换之后才计算得到的表达式。转换由函数cond->if完成,它不计算cond表达式,只在包含多个if的嵌套列表中转换它。这可以在eval函数的定义中看到,在那里有这样的情况:
((cond? exp) (eval (cond->if exp) env))在您看到的解决方案中,对cond->if函数进行了修改,以便它转换列表中的=>语法(正如您正确地观察到的那样),一个包含函数的列表作为第一个元素,它的参数作为第二个元素,该列表将在解释器的后续步骤中得到正确的计算。
https://stackoverflow.com/questions/47946240
复制相似问题