Почему я не могу определить «или функцию» в схеме? - PullRequest
6 голосов
/ 05 ноября 2011

Я нашел этот вопрос о специальной функции "или" на схеме:

Джо Хакер громко заявляет, что нет никакой причины, или в Схеме должна быть особая - ее можно определитьпрограммистом, вот так:

(define (or x y)
    (if x
        #t
        y))

Прав ли Джо?

Я не могу понять, почему это невозможно сделать.

Не мог бы какой-нибудь специалист по схемам объяснить, работает ли это, а если нет, то почему?

Ответы [ 2 ]

13 голосов
/ 05 ноября 2011

Это потому, что эта версия or оценивает все свои аргументы (так как это функция), в то время как стандартная схема or (которая не является функцией, но специальным синтаксисом) не делает. Попробуйте запустить (or #t (exit)) на схеме REPL, а затем попробуйте то же самое с вашей функцией or.

Поведение стандарта or иногда называют короткозамкнутым : он оценивает только те аргументы, которые ему нужны. Это очень распространено для бинарного логического оператора (or и and) в разных языках программирования. Тот факт, что or выглядит как вызов функции, является особенностью синтаксиса Scheme / Lisp, но выглядит обманчиво.

1 голос
/ 05 ноября 2011

Работает ли это или нет, зависит от того, что вы хотите, чтобы он делал. Это, безусловно, работает в том смысле, что для двух заданных логических значений он вернет ожидаемый результат. Однако он не будет функционально эквивалентным обычному or, потому что он не закорачивает, то есть, если ваше определение (or #t (/ 0 0)) вызовет ошибку, потому что вы делите 0 на 0, а при использовании обычного or он просто вернет #t и не пытайтесь оценить (/ 0 0) вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...