3

質問:

((lambda (x y) (x y)) (lambda (x) (* x x)) (* 3 3))

これは中間で 1 位でした。私は「81 9」を入れました。とにかく、なぜ81なのかわかりません。

理由は理解できます(lambda (x) (* x x)) (* 3 3) = 81が、最初のラムダ x と y の値が何であるか、そして が何をするのか理解でき[body] (x y)ません。

だから、最初の部分が何もしないように見える理由を誰かが説明してくれることを望んでいました.

4

4 に答える 4

9

これを明確にするために、いくつかのインデントが必要です

((lambda (x y) (x y))
 (lambda (x) (* x x))
 (* 3 3))
  • (lambda (x y) (x y)); xパラメータのみで呼び出しyます。
  • (lambda (x) (* x x)); パラメータの二乗に評価されます。
  • (* 3 3); 9に評価

つまり、「パラメータとして9を指定してsquare関数を呼び出す」ということです。

EDIT:同じことは次のように書くことができます

((lambda (x) (* x x))
 (* 3 3))

演習の目的は、スキーム形式の評価に暗黙的な関数の適用がどのように含まれるかを強調することだと思います。

于 2008-10-21T21:00:04.673 に答える
6

これをもう一度見てみましょう...

((lambda (x y) (x y)) (lambda (x) (* x x)) (* 3 3))

フォームを評価するには、フォームの各部分を順番に評価します。フォームには 3 つの要素があります。これは最初の(機能)位置にあります:

(lambda (x y) (x y))

これは、フォームの 2 番目の要素であり、関数の最初の引数です。

(lambda (x) (* x x))

フォームの最後の要素なので、関数の 2 番目の引数です。

(* 3 3)

この場合、評価の順序は問題ではないので、左から始めましょう。

(lambda (x y) (x y))

Lambda は関数を作成するため、これは x と y の 2 つの引数を取り、x を y に適用する (つまり、1 つの引数 y で x を呼び出す) 関数として評価されます。これを call-1としましょう。

(lambda (x) (* x x))

これは、1 つの引数を取り、この引数の 2 乗を返す関数に評価されます。したがって、これを正方形と呼ぶことができます。

(* 3 3)

これは明らかに9に評価されます。

OK、この最初の評価の実行後、次の結果が得られました。

(call-1 square 9)

これを評価するために、2 つの引数square9を指定してcall-1を呼び出します。call-1を適用すると、次のようになります。

(square 9)

それがcall-1の機能であるため、最初の引数を 2 番目の引数で呼び出します。ここで、 9の 2 乗は81で、これは式全体の値です。

于 2008-10-21T21:40:52.470 に答える
2

おそらく、そのコードを Common Lisp に翻訳すると、その動作が明確になります。

((lambda (x y) (funcall x y)) (lambda (x) (* x x)) (* 3 3))

またはさらに明示的に:

(funcall (lambda (x y) (funcall x y))
         (lambda (x) (* x x))
         (* 3 3))

実際、最初のラムダは、次のように要約されるため、何も役に立ちません。

(funcall (lambda (x) (* x x)) (* 3 3))

等しい

(let ((x (* 3 3)))
  (* x x))

等しい

(let ((x 9))
  (* x x))

等しい

(* 9 9)

81に等しい。

于 2008-10-21T23:22:18.430 に答える
1

これまでに投稿された回答は優れているため、既に述べたことを複製するのではなく、プログラムを別の方法で見ることができます。

(define (square x) (* x x))

(define (call-with arg fun) (fun arg))

(call-with (* 3 3) square)

それはまだ奇妙に見えますか?

于 2008-10-22T02:48:53.347 に答える