In standard Scheme è possibile scriverePerché manca "se" con un braccio solo da Racket?
(if (> x 2)
(set! x (- x 1)))
, ma questo non è possibile in Racket - Racket del if
richiede sempre due bracci. Perché?
In standard Scheme è possibile scriverePerché manca "se" con un braccio solo da Racket?
(if (> x 2)
(set! x (- x 1)))
, ma questo non è possibile in Racket - Racket del if
richiede sempre due bracci. Perché?
Rationale
La variante con un braccio di if
è stato rimosso dal Racket per evitare errori.
Nel codice funzionale si utilizza sempre la variante a due bracci di if
.
(if test expr-on-true expr-on-false)
Dimenticando il secondo braccio expr-on-false
non porterà ad una sintassi errori, ma per un errore di runtime (l'espressione restituirebbe #<void>
).
Per evitare questi errori frequenti nel codice funzionale, è stato deciso di introdurre il modulo when
per la variante con braccio singolo di if
.
(when test expr-on-true)
Oltre a prevenire errori accidentali, la nuova forma chiaramente indicato ad un lettore di codice, che il codice si basa su effetti collaterali.
codice porting da schema standard Racket
Se si tenta l'esecuzione di codice Scheme in Racket e vedere il messaggio di errore
if: bad syntax (must have an "else" expression)
è necessario riscrivere l'espressione if
a when
o unless
.
Semplicemente riscrivere:
(if test expr1) to (when test expr1)
e
(if (not test) expr1) to (unless test expr1).