コード全体で値を変更せずに、関数内で 2 つの確率変数を定義するために、scheme の組み込みの let 関数を使用できるかどうか疑問に思っていました。たとえば、私が書いた場合:
(let (x (- (* 2 (random)) 1)))
(let (y (- (* 2 (random)) 1)))
関数が終了するまで x の値は一定ですか? x と y を 2 乗して平方根を取りたいのですが、それらの値を同じに保つ必要があります。
はい、let
指定された識別子に値をバインドします。その値は、使用set!
しない限り変更されません。
だからあなたはこれを行うことができます:
(let ((x (- (* 2 (random)) 1))
(y (- (* 2 (random)) 1)))
(sqrt (+ (* x x) (* y y))))
もちろん、hypot
あなたがしていることに対して関数を定義する方が簡単だと思います(Cのhypot
関数に対応):
(define (hypot x y)
(sqrt (+ (* x x) (* y y))))
(hypot (- (* 2 (random)) 1)
(- (* 2 (random)) 1))
let
これで、まったく使用する必要がなくなりました。
接続がすぐにわからない場合、let
舞台裏で機能する方法は、(この場合は とほとんど同じ内容のhypot
) 関数を作成し、バインドしている値でその関数を呼び出すことです。したがって、上記の 2 つのコード スニペットは事実上同一です (ただし、後者は のトップレベル バインディングも追加しますhypot
)。