scheme消息传递形式的系统构建

除前文介绍的通用型构建方式,数据导向的构建方式,本节介绍了新的消息传递风格的构建。

点击查看代码
(define (make-from-real-imag x y)
    (define (dispatch op)
        (cond ((eq? op 'real-part) x)
              ((eq? op 'imag-part) y)
              ((eq? op 'magnitude) (sqrt (+ (square x)(square y))))
              ((eq? op 'angle) (atan y x))
              (else (error "unknown op" op)))))
(define (apply-generic op arg) (arg op))
练习2.75 根据消息传递的风格,构造make-from-mag-ang
点击查看代码
(define (make-from-mag-ang r a)
    (define (dispatch op)
        (cond ((eq? op 'real-part) (* r (cos a)))
              ((eq? op 'imag-part) (* r (sin a)))
              ((eq? op 'magnitude) r)
              ((eq? op 'angle) a)
              (else (error "unknown op" op)))))
练习2.76 显式分派、数据导向和消息传递三种方式对于新增的操作和类型哪种更优? 解答:显式分派风格,需要编写新类型的每个操作函数,并在每个通用操作函数的 cond 中,添加一个新的分支。添加新的操作,则要在每个类型里添加新的操作函数。 所以无论是添加类型,还是添加操作,需要改动的地方都很多。且原有操作或类型越多,添加新的工作量就越大。 数据导向风格,添加类型时,只需要在添加该类型的安装包,通用函数不需要做任何修改。添加新操作则需要在每个包里添加新的操作函数,并且在表格里注册。 消息传递风格,和数据导向风格类似。在每个类型里隐含一个操作表格,并作为分发依据。同样的,添加类型需要写一个新的分发函数,而添加操作则需要修改所有分发函数。 综上,显示分派是最麻烦的方式,好处在于直观;数据导向围绕表格进行,需要对表格进行注册和查找;消息传递风格在添加新类型时更便捷,但添加新的操作相对麻烦。
posted @ 2026-01-14 17:55  檐上落白luckin  阅读(0)  评论(0)    收藏  举报