1

2 つの手続きを引数 (w,x) として取り [w と x は、引数として 2 つの数値を与えられた場合に正しく動作することが期待できることに注意してください]、2 つの数値 (y,z ) を引数として、y と z に適用されたときに最大数になるプロシージャ (w または x) を返します (つまり、C++ 疑似コードで if ((ywz) > (yxz)) {return w; } else {return x;} )

だから私は始めました

(define proc4(lamdda ( wx) (lambda yz)... 次に、if 部分を実行したかった。 (if (> (apply w ( yz)) (apply x( wz))) のようなものですが、エラーが発生し続けます.

インターネットでヘルプを見つけようとしていますが、これまで見てきたことはすべて意味がありません。

4

3 に答える 3

2

を使用せずに、関数オブジェクトを直接呼び出すことができますapply

(define (proc4 f g)
  (lambda (x y)
    (if (> (f x y) (g x y))
        f
        g)))
于 2012-11-13T17:08:14.193 に答える
1

@ChrisJester-Young の回答の構文糖衣 - 次のような別のプロシージャを返すプロシージャを宣言できます。

(define ((proc4 f g) x y)
  (if (> (f x y) (g x y))
      f
      g))

上記のコードでは、最初のプロシージャがパラメータとしてプロシージャfおよびを受け取り、次に、パラメータとしておよびgを受け取るプロシージャを返します。およびがプロシージャであることは、定義の本体内で使用される方法からわかりますが、任意の名前を付けることができます。もちろん、通常の方法でプロシージャを呼び出すことができます。xyfg

((proc4 + *) 10 20)
=> #<procedure:*>

この例で興味深い点は、プロシージャーをパラメーターとして渡す (および値として返す) こともできるというapplyことです。他のプロシージャーと同様に、パラメーターとして受け取ったプロシージャーを呼び出すだけで、その必要はありません。また、この質問に対するすべての回答は同等ですが、私が使用している簡略構文はすべてのインタープリターで使用できるわけではないことに注意してください。

于 2012-11-13T18:24:00.410 に答える
0

私はこの(明らかに宿題の)質問をあまり理解できませんが、私はこれに行きます:

(define proc4
  (lambda (w x)
    (lambda (y z)
      (if (> (w y z) (x y z))
          w
          x))))
于 2012-11-13T17:10:58.320 に答える