標準的なスキームでは、次のように書くことができます
(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).