首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SICP练习4.5

SICP练习4.5
EN

Stack Overflow用户
提问于 2017-12-22 19:08:09
回答 1查看 157关注 0票数 0

我正在学习SICP并做编程练习。我有一个关于练习4.5的问题。练习4.5是:

方案允许为cond子句(<test> => <recipient>)提供额外的语法。如果<test>计算为真值,则计算<recipient>。它的值必须是一个参数的过程;然后对<test>的值调用这个过程,结果作为cond表达式的值返回。例如:

代码语言:javascript
复制
(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>组成的列表,不是函数调用。我该怎么办?它已经困扰了我很长时间..。

EN

回答 1

Stack Overflow用户

发布于 2017-12-22 20:05:46

评价者的核心中,在“特殊表格”下写着:

将案例分析(cond)转换为if表达式的集合,然后进行评估。

也就是说,首先在程序级别上完成转换,并且只有在此转换之后才计算得到的表达式。转换由函数cond->if完成,它不计算cond表达式,只在包含多个if的嵌套列表中转换它。这可以在eval函数的定义中看到,在那里有这样的情况:

代码语言:javascript
复制
((cond? exp) (eval (cond->if exp) env))

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47946240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档