Generics MIT方案通用运算符表包

Generics MIT方案通用运算符表包,generics,scheme,message,Generics,Scheme,Message,我的一个实践考试的一个问题是围绕消息传递和数据导向程序。它要求执行一个过程,该过程利用表初始化这些安装包: (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-kilom

我的一个实践考试的一个问题是围绕消息传递和数据导向程序。它要求执行一个过程,该过程利用表初始化这些安装包:

(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)

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

2dput过程只是将条目添加到表中。运行
install-*-package
代码后,您会得到如下结果(其中
[proc]
是给定代码中定义的过程之一):

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

(define (generic-op operator object)
    ((2d-get [first-tag] [second-tag]) [data]))
在这种形式下,
[第一个标签]
将只是用于指定操作员的符号,例如,
'get-miles
[第二个标签]
将是附加到数据的符号,您可以通过给定的过程
get-tag
[数据]
是您实际想要执行操作的号码,您可以通过给定的过程
获取内容
。将所有这些整合成以下内容的最终答案:

(define (generic-op operator object)
    ((2d-get operator (get-tag object)) (get-contents object)))

CSCI 1901在明尼苏达大学?他们没有提供任何解决方案,这些实践考试,所以我们在很大程度上留给我们自己的设备在这方面。虽然有些问题很容易通过口译员解决,但其他类似的问题很难解决(至少对我来说是这样)。我之所以这么问,是因为我上学期选修了这门课程,碰巧我真的很喜欢这个计划。我的回答够你继续说下去吗?我遗漏了一个明确的答案,但是如果你在我的表单顶部“插入”一些给定的过程,你会得到正确的答案。很抱歉,我很晚才回复你这个问题,但我找到了解决方案。事实上,你能够帮助我开始学习,在一位同学的帮助下,我成功地找到了解决方案。非常感谢。
(define (generic-op operator object)
    ((2d-get operator (get-tag object)) (get-contents object)))