如何在Scheme中正确实现对象继承

如何在Scheme中正确实现对象继承,scheme,closures,r6rs,Scheme,Closures,R6rs,作为练习,我尝试实现一个小的面向对象程序,包含两个类: 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) (

作为练习,我尝试实现一个小的面向对象程序,包含两个类:

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
是一个列表,因此它不起作用


我能做什么?

点2d
lambda中,您试图使用调用
点1d
的函数

(p1d f (list arg1 arg2 ... argN))
point1d
希望参数为:

(p1d f arg1 arg2 ... argN)
为了解决这个问题,
cons
f到
args
,然后
将其应用到
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)))))))

非常感谢。如果你想编辑你的答案,在第四行最后一个括号是错误的:)(我不能编辑,因为编辑必须至少6个字符长)