2017-12-04 29 views
1

私は以下のプログラムコードを理解していません。誰も私にそれを説明することはできますか?Scheme(DrRacket)ラムダ式

(define myFunction 
    (lambda (f x y z) 
    (f x y z))) 

どうすれば簡単にできますか?

答えて

5

あなたはそれがまったく同じことを定義するための構文的なショートカットです

(define (myFunction f x y z) 
     (f x y z)) 

として、ビット構文見せることを除いて、ずっとそれを簡略化することができません。

この方法で、あなたは書き換えルールとして精神的に扱うことができます:あなたのコードで

 (myFunction f x y z) 

を見るたびに - fは、xyzプレースホルダが参照しているものは何でも- あなたは置き換えることができます

 (f x y z) 

実際の値、別名引数をプレースホルダに置き換えて、別名function parameter ers。

したがって、あなたは意味をなすために、新しいコードのために、fは三つの引数、xyzを受け入れることができる機能であることを参照してください。

したがって、たとえば、あなたが(define (f x y z) (+ x y z))を定義した場合、あなたは

(myFunction f 1 2 3) 

を呼び出すことができますし、戻って結果を得る - あなただけの上で定義した関数fを呼び出した結果である、値,および。

f内部myFunctionは、値を参照するグローバル名fという名前のファンクションを参照します。 lambdaフォームは値を定義します - 無名関数 - defineはそれにという名前をバインドします。その名前の使用はその値を参照します。これ以降はfとなります。スキームでは、関数は他の値と同じです。グローバル関数fが、それはそれらを受信したときそれが受け取る三つの引数、+を適用するために定義されていること

。実際には、「私に3つの値を与え、あなたのためにそれらを合計します」と言っています。(myFunction f 1 2 3)はあなたの選択した3つの値を持っています。

+0

ありがとうございます。 – Memo

0

lambda ...は、4つの引数を必要とする関数を作成します。最初の引数(f)自体が関数である必要があります。 (f x y z)は、このfを他の3つの引数に適用します。

defineは、ラムダにmyFunctionという名前を付けます。

+0

お返事ありがとうございます。しかし、あなたがそうであれば(定義する(f x y z) (+ x y z)) ラムダexpresionsの2番目のfはまだ動作しません。次のエラーメッセージが表示されます(関数呼び出し:開いたかっこの後の関数が必要ですが、変数が見つかりました) – Memo