sicp 2.4.3数据定向编程和可加性,方案

时间:2017-06-30 06:15:32

标签: scheme

有些人可以澄清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)”中调用。

1 个答案:

答案 0 :(得分:1)

chapter包含some sentences,表示您只是假设存在putget程序:

  

要实现此计划,假设我们有两个过程putget,用于操作操作和类型表:

(put <op> <type> <item>)
     

在表格中安装<item>,由<op><type>编制索引。

(get <op> <type>)
     

在表格中查找<op><type>条目,并返回在那里找到的项目。如果未找到任何项目,get将返回false。

     

目前,我们可以假设我们的语言中包含putget

所以,现在我们必须要求澄清你的问题:

  1. 您是否在询问&#34;如何实施类似install-rectangular-package的流程,以便在评估(install-rectangular-package)后,get过程可以查找所需的操作?&# 34;

  2. 或者您在询问&#34; get本身如何工作?&#34;

  3. 或者您在问:&#34;即使如果我们假设这样的表格支持putget,那么{{3工作,它安装多个不同的函数,其名称如real-part(和imag-part等),即使一个real-part来自矩形包,另一个real-part来自极地包裹?&#34;

  4. 如果您提出第一个问题,答案是:install-rectangular-package只需使用适当的参数调用put即可扩展get将访问的查找表。

    如果您要问第二个问题,那么您需要了解putget的实施方式,这将在第3章中讨论。但快速回答是:您可以使用数据存储由{<op>, <type>, <item>}插入的每个put三元组的记录的结构。这本书描述了一种方法,你只需要建立一个条目列表。

    putget的任何实现需要做的主要有趣的事情是必须修改一些隐藏状态。本书使用set-cdr!操作来执行此操作。使用某种形式的命令式操作可能是他们等到第3章描述putget的实现的原因。)

    如果你问的是第三个问题,答案就是presented code&#34;

    的魔力

    install-rectangular-package的定义包含内部定义的集合,install-polar-package具有另一个内部定义集合。即使在两个定义中选择的名称之间存在重叠,安装极性包也会覆盖之前由矩形包定义的函数。

    (重要的是要区分函数定义中使用的名称与函数值/对象(您可能认为是(lambda (x y) ...))本身。即使install-rectangular-package和{{ 1}}重复使用相同的名称,它们创建不同的函数值,然后将这些不同的值放入install-polar-package / put表中,没有附加到任何重要性用于最初定义它们的名称。)

    即使书中get / put表的图片如下:

    lexical scoping

    表中的条目是不是名称。它们是功能对象。 getreal-part的其他本地定义不会影响imag-partinstall-rectangular-package安装的条目;影响这些条目的唯一方法是使用匹配的install-polar-packageput参数调用 <op>本身来覆盖表中的上一个单元格。

    有关词汇范围和思考本地函数定义的方法的更多讨论,我建议Table of Operations for complex number system(&#34; HtDP&#34;代表&#34;如何设计程序&#34;,其中,像SICP一样,是一个编程的介绍,但写的方式比SICP更能说明问题;另见this part of HtDP。)