0
(define-record-type car-ivar
       (フィールド効率 (タンク内可変ガス)))
(define-record-type car-methods
       (フィールズ ドライブ! get-gas-in-tank refuel))
(define refuel (ラムダ (cg) ((car-methods-refuel c) g)))
(get-gas-level を定義する
       (ラムダ (c) ((car-methods-get-gas-in-tank c))))
(ドライブを定義してください!
       (ラムダ (c 距離) ((car-methods-drive! c) 距離)))

(車種定義
       (ラムダ (効率)
         (let ([car1 (make-car-ivars 効率 0)])
           (let ([set-gas-level!
                   (ラムダ (ガス) (car-ivars-gas-in-tank-set! car1 ガス))]
                 [ガスレベル
                   (ラムダ () ((car-ivars-gas-in-tank car1)))])
             (車を作る方法
               ;;ドライブ!
               (ラムダ (距離)
                (設定ガスレベル!
                 (- (get-gas-level)
                 (/効率距離)))
               ;;ガスレベルを取得
               (ガスレベルを取得)
               ;;給油
               (ラムダ (ガス 1)
                 (設定ガスレベル!
                    (+ (get-gas-level) ガス1)))))))))

さて、私はこのコードを持っています。テストケースを実行しようとすると

(ハイブリッド定義 (make-car 50))
私は得る
例外: #procedure コンストラクターへの引数の数が正しくありません
エラー。そして、それがどこから来ているのかよくわかりません。

4

1 に答える 1

0

driveの部分の定義にmake-car右括弧がありません。これは、make-car-methods引数が1つしかないことを意味します。

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-11-08T21:33:55.573 に答える