2012-11-18 20 views
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) 

我不记得有这个实验室,但它基本上就是把已经存在的通用程序和创建简单的程序,以获得已经包含在它的值。如果有人能够阐明如何解决这个问题,我将非常感激。再次,我很抱歉,我没有任何表现,但我真的不知道该怎么做。

+0

CSCI 1901在明尼苏达大学吗? – oobivat

+0

他们不提供这些练习考试的任何解决方案,所以我们在这方面几乎留给了我们自己的设备。虽然一些问题很容易找到解释器,但其他人很难钉住头(至少对我而言)。 – CodeRook

+0

我只问,因为上学期我参加了这门课程,碰巧真的很享受计划。我的回答足以让你继续下去吗?我忽略了一个明确的答案,但是如果您将顶部的一些给定过程“插入”到我的表单中,您将得到正确的答案。 – oobivat

回答

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] | 

然后你会在generic-op人体利用2d-get使每当你在一段标记的数据上调用过程时,程序就会知道它应该使用的过程的版本(公制/英制)。

(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))) 
相关问题