標準的なスキームでは、次のように書くことができます
(if (> x 2)
(set! x (- x 1)))
しかし、これはラケットでは不可能です。ラケットにはif常に 2 本の腕が必要です。なんで?
根拠
の片腕バリアントはif、バグを防ぐために Racket から削除されました。
関数型コードでは、常に の 2 アーム バリアントを使用しifます。
(if test expr-on-true expr-on-false)
2 番目のアームexpr-on-falseを忘れても、構文エラーにはなりませんが、実行時エラーが発生します (式は を返します#<void>)。
機能コードで頻繁に発生するこれらのバグを防ぐためにwhen、 の片腕バリアントのフォームを導入することが決定されましたif。
(when test expr-on-true)
偶発的なバグを防ぐだけでなく、新しいフォームは、コードが副作用に依存していることをコードの読者に明確に示します。
標準スキームから Racket へのコードの移植
Racket で Scheme コードを実行しようとすると、エラー メッセージが表示されます。
if: bad syntax (must have an "else" expression)
if式をwhenまたはに書き換える必要がありますunless。
単純に書き直します:
(if test expr1) to (when test expr1)
と
(if (not test) expr1) to (unless test expr1).