"面向对象"方案

时间:2012-11-08 03:35:04

标签: scheme

(define-record-type car-ivars
       (fields efficiency (mutable gas-in-tank)))
(define-record-type car-methods
       (fields drive! get-gas-in-tank refuel))
(define refuel (lambda (c g) ((car-methods-refuel c) g)))
(define get-gas-level
       (lambda (c) ((car-methods-get-gas-in-tank c))))
(define drive!
       (lambda (c distance) ((car-methods-drive! c) distance)))

(define make-car
       (lambda (efficiency)
         (let ([car1 (make-car-ivars efficiency 0)])
           (let ([set-gas-level!
                   (lambda (gas) (car-ivars-gas-in-tank-set! car1 gas))]
                 [gas-level
                   (lambda () ((car-ivars-gas-in-tank car1)))])
             (make-car-methods
               ;;drive!
               (lambda (distance)
                (set-gas-level!
                 (- (get-gas-level)
                 (/ efficiency distance)))
               ;;get-gas-level
               (get-gas-levels)
               ;;refuel
               (lambda (gas1)
                 (set-gas-level!
                    (+ (get-gas-level) gas1)))))))))

好的,我有这个代码。当我尝试运行我的测试用例时

(define hybrid (make-car 50))
我得到
Exception: incorrect number of arguments to #procedure constructor
错误。而且我不太确定它的来源。

1 个答案:

答案 0 :(得分:0)

您对drivemake-car部分的定义缺少右括号,这意味着make-car-methods只能获得一个参数。

Emacs中的重新缩进使这一点非常明显:

(define make-car
    (lambda (efficiency)
        (let ([car1 (make-car-ivars efficiency 0)])
            (let ([set-gas-level!
                   (lambda (gas) (car-ivars-gas-in-tank-set! car1 gas))]
                  [gas-level
                   (lambda () ((car-ivars-gas-in-tank car1)))])
                (make-car-methods
                 ;;drive!
                 (lambda (distance)
                     (set-gas-level!
                      (- (get-gas-level)
                         (/ efficiency distance)))
                     ;;get-gas-level
                     (get-gas-levels)
                     ;;refuel
                     (lambda (gas1)
                         (set-gas-level!
                          (+ (get-gas-level) gas1)))))))))