作为练习,我正在尝试实现一个面向对象的小程序,有两个类:
point1d: 1 attribute (x), getter and setter
point2d: inherits from point1d, add a new attribute (y) and its getter and setter
我已将每个类都实现为闭包。这是第一个的代码:
(define (point1d xx)
(let ((x xx))
(define (get-x)
x)
(define (set-x xx)
(set! x xx))
(lambda (f . args)
(apply
(case f
((get-x) get-x)
((set-x) set-x))
args))))
和第二个:
(define (point2d xx yy)
(let ((p1d (point1d xx))
(y yy))
(define (get-y)
y)
(define (set-y yy)
(set! y yy))
(lambda (f . args)
(case f
((get-y) (get-y))
((set-y) (apply set-y args))
(else (p1d f args))))))
我对第二个定义有一些问题;在最后一行我尝试调用parents方法,但由于args
是一个列表,它不起作用。
我该怎么办?
答案 0 :(得分:1)
在point2d
lambda中,您尝试使用
point1d
的函数
(p1d f (list arg1 arg2 ... argN))
而point1d
期望参数为:
(p1d f arg1 arg2 ... argN)
要解决此问题,cons
f args
,然后apply
转到p1d
,就像我在p1d
的固定定义中所做的那样
(define (point2d xx yy)
(let ((p1d (point1d xx))
(y yy))
(define (get-y)
y)
(define (set-y yy)
(set! y yy))
(lambda (f . args)
(case f
((get-y) (get-y))
((set-y) (apply set-y args))
(else (apply p1d (cons f args)))))))