Ознакомьтесь с документацией для if
и or
.if
используется для проверки условия и выполнения только одного из двух возможных значений - если условие true
, первая часть будет выполнена, если false
вторая часть будет выполнена:
(if (= 1 0)
"not executed"
"executed")
=> "executed"
or
- это логический соединитель , который может принимать несколько аргументов, он вернет первое найденное не ложное значение или false
, если все значения ложные,Обычно вы используете or
для подключения логических выражений, но это не всегда так:
(or #f 7 10)
=> 7
(or (= 1 0) (= 1 2))
=> #f
Также имейте в виду, что в схеме все значения считаются true
, кроме #f
, чтоэто false
.Что касается последней части вашего вопроса: да, вы можете использовать if
для имитации or
, это будет примерно так:
; equivalent to (or value1 value2)
(if value1
value1
value2)
Выше приведено упрощение, потому что в идеале мы должны оценитьvalue1
ровно один раз, а также потому, что эта версия не поддерживает несколько аргументов.Но будьте осторожны: как только вы попытаетесь написать это как процедуру, вы столкнетесь с проблемами!
(define (my-or value1 value2)
(if value1
value1
value2))
Это будет не работать как or
, процедура оценивает оба аргумента перед вычислением if
, тогда как действительное or
оценивает только необходимые выражения, пока не найдет значение true
- это то, что мы называем оценкой короткого замыкания.Чтобы понять, что я имею в виду, попробуйте следующее:
(or 42 (/ 1 0))
=> 42
(my-or 42 (/ 1 0))
=> /: division by zero
Мы не можем по-настоящему реализовать or
, if
как процедуры, они специальные формы и должны быть реализованына уровне переводчика со специальными правилами оценки.