1

私はランダムにリストを作成し、それをより大きな関数で使用しようとしています。

        (define make-random-list
        (if
          (= (random 2) 0) (list 2 3)
                           (list 3 2)))

これはリスト(2 3)のみを生成し、理由はわかりません。これを引き起こすために何が起こっているのですか?

このように書くと関数を動作させることができます

  (define make-random-list
   (lambda (x)
   (if
    (= (random x) 0) (list 2 3)
                     (list 3 2))))

と呼び出し(make-random-list 2)

しかし、なぜそれが機能し、もう一方が機能しないのか理解できません。最初の関数がランダムな結果を生成することを許可しないスキームで何が起こっているのでしょうか?

4

2 に答える 2

0

最初のスニペットでは、1回限りの計算の結果を変数に割り当てています。ここで必要なのは、呼び出されるたびに評価される関数を定義することです。2番目のスニペットはまさにそれを実行しますが、同じことを表現するためのより短い方法があります。

(define (make-random-list x)
(if
  (= (random x) 0) (list 2 3)
                   (list 3 2)))

構文の違いに注意してください。関数定義は、関数定義を仮引数名とともに括弧で囲みますが、変数名の前後には括弧がありません。

于 2012-11-25T22:03:28.233 に答える
0

Schemeでは、関数は次のlambdaように明示的に使用して定義されます。

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

または、このように、前の構文の省略形であり、暗黙的に内部を使用していますlambda-プロシージャ定義の両方のフレーバーは完全に同等です:

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

コードの最初のバージョンは機能していませんでした。これは、の評価結果を次ifの変数に割り当てているだけだからmake-random-listです。

(define make-random-list
  (if (= (random 2) 0)
      (list 2 3)
      (list 3 2)))

スキームでプロシージャを定義するにはlambda、明示的または暗黙的にを使用する必要があります。したがって、プロシージャは、次の同等の形式のいずれかを使用して定義する必要があります。

(define make-random-list
  (lambda ()
    (if (= (random 2) 0)
        (list 2 3)
        (list 3 2)))

(define (make-random-list)
  (if (= (random 2) 0)
      (list 2 3)
      (list 3 2)))

x可能な値が唯一の場合は、パラメータを渡す必要がないことに注意してください2。引数なしでプロシージャを宣言するだけです。

于 2012-11-25T22:50:16.527 に答える