Схема - разница между если и или - PullRequest
0 голосов
/ 16 ноября 2018

знает ли кто-нибудь, в чем разница между if и or в Scheme, или почему я не могу использовать его для замены или в качестве идентификатора?Я разместил код ниже.Спасибо!

;if definition
(define heiner-or
   (lambda (test-1 test-2)
    (if test-1 
      #t
      test-2)))

;or definition
> (heiner-or (= 10 10) (> 2 5))
#t
> (heiner-or (> 23 42) (< 5 2))
#f

1 Ответ

0 голосов
/ 16 ноября 2018

Ознакомьтесь с документацией для 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 как процедуры, они специальные формы и должны быть реализованына уровне переводчика со специальными правилами оценки.

...