终于有习题了,但是这次的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是比较方便的