我的一次练习考试的一个问题是以消息传递和数据导向程序为中心。它要求使用初始化这些安装包的表的过程:
(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)
我确实记得有一个实验室,但它基本上采用了一个已经存在的通用程序,并创建了简单的程序来获取已包含在其中的值。如果有人能说明如何处理这个问题,我将非常感激。再一次,对不起,我没有什么可以展示的,但老实说,我不知道该怎么做。
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)))