プロシージャの本体は上から下に評価されます。先頭に式がいくつあっても、最後の式の値のみが返されます。たとえば、これを書くと:
(define (f)
(+ 2 2) ; evaluates to 4, but we don't do anything with it, so it's lost
(+ 4 4)) ; evaluates to 8, this is the returned value
...(f)
戻り値 isを呼び出すと8
、最初の式の値が失われます。おそらく、複数の値を返したいということでしょうか? これは、インタープリターによっては可能です。たとえば、Racket では次のようになります。
(define (f)
(values (+ 2 2) (+ 4 4)))
(f)
=> 4
8
2 つの(f)
値を返すようになりました。それらを使用する場合は、返された複数の値を「キャプチャ」するための特別なフォームが必要です。この例では、次を使用します。let-values
(let-values (((x y) (f))) ; 4 is bound to x, 8 is bound to y
(+ x y))
=> 12
式の使用に関する質問の別の解釈if
: 内に複数の式を記述する必要がある場合はif
、すべての式をbegin
フォーム内にパックする必要があります (ちなみに、プロシージャの本体は暗黙的に内にあり、begin
)。
しかし、繰り返しになりますが、すべての式が順番に実行されても、最後の式の値のみが結果として返されます。そのため、中間のすべての式は、値ではなく効果のためにのみ実行する必要があります。例えば:
(if (= 1 1) ; condition is true
(begin ; execute a sequence of expressions
(+ 2 2) ; evaluates to 4, but the value is lost
(+ 4 4)) ; evaluates to 8, this is the returned value
(begin
(+ 1 1)
(+ 3 3)))
=> 8
もちろん、上記の例でcond
は、暗黙的な を持つ a を使用する方が簡単begin
です。これは前のスニペットと同等です:
(cond
((= 1 1) ; condition is true, implicit `begin`
(+ 2 2) ; evaluates to 4, but the value is lost
(+ 4 4)) ; evaluates to 8, this is the returned value
(else
(+ 1 1)
(+ 3 3)))
=> 8