LINUX.ORG.RU

История изменений

Исправление monk, (текущая версия) :

Чистые классы на замыканиях

Могу то же самое на замыканиях без racket/class переписать.

Я говорил об обычной модели на замыканиях, типа той которая с банковскими счетами в SICP.

Если ты про

(define (make-account balance)
  (define (withdraw amount)
    (if (>= balance amount)
        (begin (set! balance (- balance amount))
               balance)
        "Insufficient funds"))
  (define (deposit amount)
    (set! balance (+ balance amount))
    balance)
  (define (dispatch m)
    (cond ((eq? m 'withdraw) withdraw)
          ((eq? m 'deposit) deposit)
          (else (error "Unknown request -- MAKE-ACCOUNT"
                       m))))
  dispatch)

то здесь нет ни класса, ни, тем более, суперкласса. Изменение методов добавляется тривиально

(define (make-account balance)
  (define (withdraw amount)
    (if (>= balance amount)
        (begin (set! balance (- balance amount))
               balance)
        "Insufficient funds"))
  (define (deposit amount)
    (set! balance (+ balance amount))
    balance)
  (define (dispatch m)
    (cond ((eq? m 'withdraw) withdraw)
          ((eq? m 'deposit) deposit)
          ((eq? m 'set-withdraw!) 
           (lambda (new-body)
             (set! withdraw 
               (lambda () 
                 (set! balance (new-body balance))))))
          (else (error "Unknown request -- MAKE-ACCOUNT"
                       m))))
  dispatch)

Исходная версия monk, :

Чистые классы на замыканиях

Могу то же самое на замыканиях без racket/class переписать.

Я говорил об обычной модели на замыканиях, типа той которая с банковскими счетами в SICP.

Если ты про

(define (make-account balance)
  (define (withdraw amount)
    (if (>= balance amount)
        (begin (set! balance (- balance amount))
               balance)
        "Insufficient funds"))
  (define (deposit amount)
    (set! balance (+ balance amount))
    balance)
  (define (dispatch m)
    (cond ((eq? m 'withdraw) withdraw)
          ((eq? m 'deposit) deposit)
          (else (error "Unknown request -- MAKE-ACCOUNT"
                       m))))
  dispatch)

то здесь нет ни класса, ни, тем более, суперкласса. Изменение методов добавляется тривиально (define (make-account balance) (define (withdraw amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) «Insufficient funds»)) (define (deposit amount) (set! balance (+ balance amount)) balance) (define (dispatch m) (cond ((eq? m 'withdraw) withdraw) ((eq? m 'deposit) deposit) ((eq? m 'set-withdraw!) (lambda (new-body) (set! withdraw (lambda () (set! balance (new-body balance)))))) (else (error «Unknown request — MAKE-ACCOUNT» m)))) dispatch)