1

比較的単純な銀行口座関数を作成しましたが、実行しようとすると TypeError が発生し、その理由がわかりません。それはSICPから直接出てきたので、ソリューションはすぐに利用できます.なぜ私の答えがそのエラーを生成するのかを理解したいだけです. 何かご意見は?これが私のコードです:

(define (make-password-account balance password)
    (define (withdraw amount)
        (if (>= balance amount)
            (begin (set! balance (- balance amount))
                balance)
            "Insufficient Funds"))
    (define (deposit amount)
        (set! balance (+ balance amount))
        balance)
    (define (dispatch users-guess-at-password m)
            (if (eq? users-guess-at-password password)
                (cond   ((eq? m 'withdraw) withdraw)
                        ((eq? m 'deposit) deposit)
                        (else (error "Unknown Request --make-account" m)))
               "INVALID PASSWORD"))
dispatch)

関連するインタープリターの入力とインタープリターからの出力は次のとおりです。

..loaded function...
>(define acc (make-password-account 100 'secret))
acc
>((acc 's 'withdraw) 2)
;Stack Trace:  
0  TypeError: The object "Invalid Password" is not applicable.  
1  ((acc (quote s) (quote withdraw) 2)
4

2 に答える 2

3

現在、あなたのコードはこれを行っています:

((acc 's 'withdraw) 2)
((dispatch 's 'withdraw) 2)
("INVALID PASSWORD" 2)
=> TypeError: The object "INVALID PASSWORD" is not applicable.

入力したパスワードが間違っている場合に対処する必要があります。パスワードが間違っていると、そのアカウントで何の役にも立たないため、エラーを通知して実行を停止する必要があります。たとえば、次の行を置き換えます。

"INVALID PASSWORD"

これとともに:

(error "INVALID PASSWORD")

これで、プロシージャは意味のあるエラー メッセージを返し、実行を停止します。または、エラーの通知が極端すぎる場合は、 @molbdnilo で提案されているように、文字列を返すことができます。もう一度"INVALID PASSWORD"、提案された手順に置き換えます。パラメーターとして何を受け取っても、エラー文字列が返されます。

(lambda (x) "INVALID PASSWORD")

実行は次のようになります。

((acc 's 'withdraw) 2)
((dispatch 's 'withdraw) 2)
((lambda (x) "INVALID PASSWORD") 2)
=> "INVALID PASSWORD"
于 2014-03-04T14:02:02.470 に答える
1

間違ったパスワードを渡しているため、

(acc 's 'withdraw)

あれは、

(dispatch 's 'withdraw)

に評価されます

"INVALID PASSWORD"

それを数値 2 に適用しようとしていますが、関数ではないためできません。

他の場合と同様に、文字列の代わりに関数を使用できます。

(lambda (x) "Invalid password")
于 2014-03-04T10:15:59.143 に答える