W standard Scheme jest możliwe napisanieDlaczego w Rakiecie brakuje jednorękiego "jeśli"?
(if (> x 2)
(set! x (- x 1)))
ale nie jest to możliwe w Racket - Rakieta na if
zawsze wymaga dwóch rąk. Czemu?
W standard Scheme jest możliwe napisanieDlaczego w Rakiecie brakuje jednorękiego "jeśli"?
(if (> x 2)
(set! x (- x 1)))
ale nie jest to możliwe w Racket - Rakieta na if
zawsze wymaga dwóch rąk. Czemu?
Uzasadnienie
jednoręki wariant if
został usunięty z rakiety, która zapobiega błędów.
W kodzie funkcji zawsze używa się dwuramiennego wariantu if
.
(if test expr-on-true expr-on-false)
zapominając drugie ramię expr-on-false
nie prowadzić do błędów składni, ale błąd wykonawczego (termin powróci #<void>
).
Aby zapobiec częstym występującym błędom w kodzie funkcjonalnym, podjęto decyzję o wprowadzeniu formularza when
dla jednorękiego wariantu if
.
(when test expr-on-true)
Oprócz zapobiegania przypadkowym błędom, nowy formularz wyraźnie wskazuje czytelnikowi kodu, że kod opiera się na efektach ubocznych.
Przenoszenie kodu z standardowym schemacie do rakieta
Jeśli spróbujesz uruchomiony kod programu w rakietę i zobaczyć komunikat o błędzie
if: bad syntax (must have an "else" expression)
trzeba przepisać wyraz if
do when
lub unless
.
Wystarczy przepisać:
(if test expr1) to (when test expr1)
i
(if (not test) expr1) to (unless test expr1).