0

我的一次练习考试中的一个问题集中在消息传递和数据导向程序上。它要求使用表初始化这些安装包的过程:

(define (attach-tag tag data) (cons tag data))
(define (get-tag data) (car data))
(define (get-contents data) (cdr data))

(define (install-metric-package)
; internal procedures
(define (get-kilometers d) d)
(define (get-miles d) (/ d 1.6))
(define (make-from-kilometers d) d)
(define (make-from-miles d) (* d 1.6))
; install metric packages
(2d-put! 'get-kilometers 'metric get-kilometers)
(2d-put! 'get-miles 'metric get-miles)
(2d-put! 'make-from-kilometers 'metric
   (lambda(d) (attach-tag 'metric (make-from-kilometers d))))
(2d-put! 'make-from-miles 'metric
   (lambda(d) (attach-tag 'metric (make-from-miles d))))
'done)

(define (install-english-package)
; internal procedures
(define (get-kilometers d) (* d 1.6))
(define (get-miles d) d)
(define (make-from-kilometers d) (/ d 1.6))
(define (make-from-miles d) d)
; install english packages
(2d-put! 'get-kilometers 'english get-kilometers)
(2d-put! 'get-miles 'english get-miles)
(2d-put! 'make-from-kilometers 'english
   (lambda(d) (attach-tag 'english (make-from-kilometers d))))
(2d-put! 'make-from-miles 'english
   (lambda(d) (attach-tag 'english (make-from-miles d))))
'done)

并允许通用运算符工作。通常情况下,我会有一些代码来展示我的努力,但是大约一天,我完全不知道如何开始使用这个代码。我得到的只是这个:

(define (generic-op operator object)

我确实记得在这方面有一个实验室,但它基本上采用了一个已经存在的通用过程并创建简单的过程来获取其中已经包含的值。如果有人能阐明如何解决这个问题,我将不胜感激。再次,我很抱歉我没有什么可展示的,但老实说,我不知道在这里做什么。

4

1 回答 1

1

2d-put!过程只是将条目添加到表中。运行install-*-package代码后,您最终会得到类似这样的结果([proc]给定代码中定义的过程之一):

                      | 'metric | 'english |
'make-from-kilometers | [proc]  |  [proc]  |
'make-from-miles      | [proc]  |  [proc]  |
'get-kilometers       | [proc]  |  [proc]  |
'get-miles            | [proc]  |  [proc]  |

然后,您将2d-get在主体中使用,generic-op这样每当您在一段标记数据上调用该过程时,您的程序就会知道它应该使用哪个版本(公制/英文)的过程。

(define (generic-op operator object)
    ((2d-get [first-tag] [second-tag]) [data]))

在这种形式中,[first-tag]将只是用于指定运算符的符号,例如'get-miles[second-tag]将是附加到数据的符号,您可以使用给定的过程访问该符号get-tag,并且[data]是您实际想要对其进行操作的数字您可以使用给定的过程访问它get-contents。将所有这些组合成这样的最终答案:

(define (generic-op operator object)
    ((2d-get operator (get-tag object)) (get-contents object)))
于 2012-11-19T22:09:14.403 回答