有些人可以澄清the chapter中描述的复杂算术的例子。我无法理解一点。我将不胜感激任何帮助。 问题如下:
有两个包含类似程序命名的包。
第一个是“(install-rectangular-package)”。第二个是“(install-polar-package)”。此外,还定义了一个程序:
(定义(make-from-real-imag x y)
(得到'make-from-real-imag'矩形)x y))
我键入方案interperter
(安装矩形包)
(安装极性包)
(make-from-real-imag 3 5)
它有效。我不明白“make-from-real”中的“get”如何在正确的包中找到合适的功能。当执行字符串“(得到'从实际成像'矩形)”时,它将替换为“(lambda(xy)(tag(make-from-real-imag xy))))”但它是如何知道的它必须在“(install-rectangle-package)”中调用函数,而不是在“(install-polar-package)”中调用。
答案 0 :(得分:1)
chapter包含some sentences,表示您只是假设存在put
和get
程序:
要实现此计划,假设我们有两个过程
put
和get
,用于操作操作和类型表:(put <op> <type> <item>)
在表格中安装
<item>
,由<op>
和<type>
编制索引。(get <op> <type>)
在表格中查找
<op>
,<type>
条目,并返回在那里找到的项目。如果未找到任何项目,get
将返回false。目前,我们可以假设我们的语言中包含
put
和get
。
所以,现在我们必须要求澄清你的问题:
您是否在询问&#34;如何实施类似install-rectangular-package
的流程,以便在评估(install-rectangular-package)
后,get
过程可以查找所需的操作?&# 34;
或者您在询问&#34; get
本身如何工作?&#34;
或者您在问:&#34;即使如果我们假设这样的表格支持put
和get
,那么{{3工作,它安装多个不同的函数,其名称如real-part
(和imag-part
等),即使一个real-part
来自矩形包,另一个real-part
来自极地包裹?&#34;
如果您提出第一个问题,答案是:install-rectangular-package
只需使用适当的参数调用put
即可扩展get
将访问的查找表。
如果您要问第二个问题,那么您需要了解put
和get
的实施方式,这将在第3章中讨论。但快速回答是:您可以使用数据存储由{<op>, <type>, <item>}
插入的每个put
三元组的记录的结构。这本书描述了一种方法,你只需要建立一个条目列表。
(put
和get
的任何实现需要做的主要有趣的事情是必须修改一些隐藏状态。本书使用set-cdr!
操作来执行此操作。使用某种形式的命令式操作可能是他们等到第3章描述put
和get
的实现的原因。)
如果你问的是第三个问题,答案就是presented code&#34;
的魔力 install-rectangular-package
的定义包含内部定义的集合,install-polar-package
具有另一个内部定义集合。即使在两个定义中选择的名称之间存在重叠,安装极性包也会不覆盖之前由矩形包定义的函数。
(重要的是要区分函数定义中使用的名称与函数值/对象(您可能认为是(lambda (x y) ...)
)本身。即使install-rectangular-package
和{{ 1}}重复使用相同的名称,它们创建不同的函数值,然后将这些不同的值放入install-polar-package
/ put
表中,没有附加到任何重要性用于最初定义它们的名称。)
即使书中get
/ put
表的图片如下:
表中的条目是不是名称。它们是功能对象。 get
或real-part
的其他本地定义不会影响imag-part
或install-rectangular-package
安装的条目;影响这些条目的唯一方法是使用匹配的install-polar-package
和put
参数调用 <op>
本身来覆盖表中的上一个单元格。
有关词汇范围和思考本地函数定义的方法的更多讨论,我建议(&#34; HtDP&#34;代表&#34;如何设计程序&#34;,其中,像SICP一样,是一个编程的介绍,但写的方式比SICP更能说明问题;另见this part of HtDP。)