32

標準的なスキームでは、次のように書くことができます

(if (> x 2)
    (set! x (- x 1)))

しかし、これはラケットでは不可能です。ラケットにはif常に 2 本の腕が必要です。なんで?

4

1 に答える 1

56

根拠

の片腕バリアントは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).
于 2012-06-02T14:37:57.193 に答える