Как правильно реализовать наследование объектов в Scheme

В качестве упражнения я пытаюсь реализовать небольшую объектно-ориентированную программу с двумя классами:

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

У меня есть некоторые проблемы со вторым определением; в последней строке я пытаюсь вызвать метод родителей, но, поскольку args - это список, он не работает.

Что я могу сделать?


person Aslan986    schedule 18.08.2012    source источник


Ответы (1)


В лямбде point2d вы пытаетесь вызвать функции point1d с помощью

(p1d f (list arg1 arg2 ... argN))

в то время как point1d ожидает, что аргументы будут:

(p1d f arg1 arg2 ... argN)

Чтобы решить эту проблему, cons на 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)))))))
person krzysz00    schedule 18.08.2012
comment
Спасибо. Если вы хотите отредактировать свой ответ, в четвертой строке последняя круглая скобка неверна :) (я не могу редактировать, потому что редактирование должно быть не менее 6 символов) - person Aslan986; 18.08.2012