25
standard Schemeではなぜラケットに「武装していない」武器がないのですか?
(if (> x 2)
(set! x (- x 1)))
を書き込むことが可能であるが、これはラケットでは不可能である - ラケットのif
は、常に2人の腕が必要です。どうして?
standard Schemeではなぜラケットに「武装していない」武器がないのですか?
(if (> x 2)
(set! x (- x 1)))
を書き込むことが可能であるが、これはラケットでは不可能である - ラケットのif
は、常に2人の腕が必要です。どうして?
理由
if
の片腕の変異体は、バグを防ぐために、ラケットから削除されました。
機能コードでは、常にif
という2つの武器を使用しています。
(if test expr-on-true expr-on-false)
expr-on-false
に構文エラーをもたらさないであろう第二のアームを忘れるが、ランタイムエラーに(式#<void>
を返すことになります)。
機能コードでこのような頻繁に発生するバグを防ぐため、if
の片腕型にはwhen
という形式を導入することが決定されました。
(when test expr-on-true)
偶発的なバグを防ぐことに加えて、新しいフォームは、明らかにコードが副作用に依存していることは、コードの読者に示しました。あなたはラケットでSchemeのコードを実行しようとすると、エラーメッセージ
if: bad syntax (must have an "else" expression)
が表示された場合は、when
またはunless
にif
式を書き直す必要があります
をラケットするために、標準的なスキームからのコードを移植
。
単純に書き換える:
(if test expr1) to (when test expr1)
と
(if (not test) expr1) to (unless test expr1).
を