SICP ex2-45

来源:互联网 发布:软件开发流程图软件 编辑:程序博客网 时间:2024/05/01 02:17

终于有习题了,但是这次的primitive put 和 get 会报错,代码无法测试,所以不给出代码

2.45要求将之前的求导函数利用添加type的方式进行选择 type 则根据运算符来加

问题为什么不把constant以及same-variable一并放到data-directed的程序中

首先我们比较constant以及same-variable 发现一个需要两个参数,一个需要一个参数,而我们利用data-directed进行过程选取,最后的过程需形式保持一致

故而,我们不将constant放入其中,那么我们再来考虑same-variable 由于选取需要时间,而该函数的使用次数较多,故而我们将其不放入其中以提高程序运行效率

另外same-variable缺少操作符,我们无法进行operator操作

第二问,要求写出sums 和products

首先我们将建立一张table 然后我们根据运算符号获取程序,然后将之前的product?的程序放入该程序中即可 sum类似

第三问过程作为table 类似第二问

第四问将 (get (operator exp) 'derive) 参数交换,我们发现2列的table 变为2行的table

2.46

一个应用问题,问题是不同分部采用数据结构不同,所以无法利用相同的过程进行信息获取

我们采用data-directed的思想可以解决

我们将该分行的数据结构信息提取的过程作为table item的结果,将分行作为一个关键词,将要索引的内容为另一个关键词,那么我们就可以实现索引了

例如我们要索引get-record获取某雇员的record 首先我们要传分部的type作为索引值,其次,我们要传递record作为索引值,

这样我们就获取了一个item (该分部的雇员的record查询)之后我们只要将雇员id之类的key值所谓索引即可查询

要实现以上功能,我们需要如下规定:

首先我们的个分部的文件结构需包含该分部的标签type 用来作为table索引值之一

其次我们的文件结构需要包含该结构是用于查询哪个项目的标签type作为table的另一个索引值,例如record

作为这个结构需要能够接受查询参数id之类的用以数据查询

现在假如我们要设计针对一个特定雇员查询其所在各分部的文件的record记录,那么我们可以建立一张各分部type表,然后依次传递至之前的record查询过程,

我们就可得到结果

最后是如果新并购一个公司,我们只需要将该公司的标签以及所含查询项过程合并入table (put 'new-division 'record new-division-record)即可

最后主要介绍了消息传递机制

以下是2-47所要求的代码

(define (make-polar r a)        (define (dispatch m)                (cond                        ((eq? m 'real-part) (* r (cos a)))                        ((eq? m 'imag-part) (* r (sin a)))                        ((eq? m 'magnitude) r)                        ((eq? m 'angle    ) a)))        dispatch)

该代码需配合operate使用,可代替real-part之类的函数过程

最后考虑:

本节三小节介绍的三种方法哪种适合加入数据类型,哪种适合加入操作类型

显然第一种加入数据类型需在每一个selecotor中添加一个数据类型判断比较麻烦

第二种则只需将表单扩建一列

第三种则新加一个make-new-data-type函数

显然2,3是比较方便的

考虑添加操作类型

第一种是添加一个操作函数

第二种是表单扩建一行

第三种则需要在每个make函数中添加一个判断语句

显然1,2是比较方便的

0 0
原创粉丝点击