【问题标题】:"Object Oriented" Scheme“面向对象”方案
【发布时间】:2012-11-08 03:35:04
【问题描述】:
(define-record-type car-ivars (现场效率(罐中可变气体))) (定义记录型汽车方法 (现场驾驶!在油箱中加油)) (define refuel (lambda (c g) ((car-methods-refuel c) g))) (定义get-gas-level (lambda (c) ((car-methods-get-gas-in-tank c)))) (定义驱动器! (lambda (c distance) ((car-methods-drive!c) distance))) (定义制造汽车 (λ(效率) (let ([car1 (make-car-ivars 效率 0)]) (让([设置气体级别! (lambda (gas) (car-ivars-gas-in-tank-set!car1 gas))] 【气级 (lambda () ((car-ivars-gas-in-tank car1)))]) (制造汽车方法 ;;驾驶! (λ(距离) (设置气体水平! (- (get-gas-level) (/效率距离))) ;;获取气体水平 (获取气体水平) ;;加油 (λ(气体1) (设置气体水平! (+ (get-gas-level) gas1)))))))))

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

(定义混合动力(制造汽车 50))
我得到一个
异常:#procedure 构造函数的参数数量不正确
错误。而且我不太确定它来自哪里。

【问题讨论】:

  • 知道您正在使用哪种方案实现会非常有用。
  • 塞巴斯蒂安的观点很好。我还认为我们没有足够的代码来说明问题。我怀疑这个错误实际上是在 make-car-ivarsmake-car-methods 中产生的,但这纯粹是推测,没有更多数据。

标签: scheme


【解决方案1】:

您对make-cardrive 部分的定义缺少右括号,这意味着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)))))))))

【讨论】:

    猜你喜欢
    • 2012-06-17
    • 2011-05-25
    • 2011-03-28
    • 2015-04-28
    • 2010-09-18
    • 2011-11-05
    • 2014-08-24
    • 2014-12-15
    • 1970-01-01
    相关资源
    最近更新 更多