2016-09-15 8 views
0

SICP私はラケットを使用してIDE博士ラケットの内側には、次の手順を定義したラムダ出力

(define (random a b c x) 
    (lambda (a b c x) 
    (+ (* a (* x x)) 
     (* b x) 
     c))) 

あなたが見るかもしれないように、その内部にラムダ式があります。私が試したの呼び出し:

(random 4 2 9 3) 

を私は出力として得た:

#<procedure:...ercício-2.4.rkt:16:2> 

私は51

このエラーが発生する理由になるだろうと思いましたか?なぜ、通訳者は手術の結果ではなく手術の結果を返すのですか?

答えて

1
(define (proc-name args ...) body ...) 

プロシージャを作成し、変数proc-nameにバインドします。この場合defineの値に変数を結合し、その値は手続きであることを起こる

(define proc-name 
    (lambda (args ...) 
    body ...)) 

ためabbrivationです。あなたが綴るしたい場合は、あなたのrandomそれは次のようになります。

(define random 
    (lambda (a b c x) 
    (lambda (a b c x) 
     (+ (* a (* x x)) (* b x) c)))) 

外に引数abcを取り、xと手順も引数abcを取り、別の手順を返す手続きです、 xは元のバインディングを効果的にシャドーイングし、次にそれらの表現をいくつか行います。それはあなたの手順では、一番上に短い形式を使用する必要がありますいずれかの手順を返すように仮定されなかった明白なので使用例は

((random #f #f #f #f) 4 2 9 3) 

次のようになります。

(define (random a b c x)  
    (+ (* a (* x x)) (* b x) c)) 

または同等の非砂糖形式:

プロシージャにプロシージャを戻すだけでなく、プロシージャで使用される引数としてプロシージャを渡すことが一般的です。 Schemeは変数のバインディングがかっこで呼び出される前にプロシージャであるかどうか分かりません。何かを試してみると余分なかっこのようなルーキーミスが奇妙なエラー "application:(+ ab)not procedure"を返します。

リターンがプロシージャである例は、部分的なアプリケーションになります。

; makes a procedure that adds initial 
(define (make-add initial) 
    (lambda (v) (+ initial v)) 

(define add-10 (make-add 10)) 
(define add-3 (make-add 3)) 

(add-3 2) ; ==> 5 
(add-10 2) ; ==> 12 
関連する問題