0

演習として、2つのクラスを持つ小さなオブジェクト指向プログラムを実装しようとしています。

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

そして2番目のために:

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

2番目の定義に問題があります。最後の行で、parentsメソッドを呼び出そうとしましたargsが、リストなので機能しません。

私に何ができる?

4

1 に答える 1

1

ラムダでは、で関数point2dを呼び出そうとしていますpoint1d

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

一方point1d、引数は次のようになります。

(p1d f arg1 arg2 ... argN)

これを解決するには、consfをに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)))))))
于 2012-08-18T14:38:13.467 に答える