(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错误。而且我不太确定它的来源。
答案 0 :(得分:0)
您对drive
中make-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)))))))))