Пропуск скобок в cond приводит к странному результату - PullRequest
0 голосов
/ 02 мая 2020

Рассмотрим следующий фрагмент

(define (f a b c)    
   (
     cond ((and (< b c) (< b a)) (+ c  a))
          ((and (< a c) (< a b)) (+ c b))
          ((and (< c b) (< c a)) (+ b  a))
   ) 
)

(display (f 2 1 3)) ; 5
(newline)
(display (f 2 8 3)) ; 11
(newline)
(display (f 2 8 -3)) ; 10

Теперь, если я прокомментирую вторую и вторую строку снизу

(define (f a b c)    
   ;(
     cond ((and (< b c) (< b a)) (+ c  a))
          ((and (< a c) (< a b)) (+ c b))
          ((and (< c b) (< c a)) (+ b  a))
   ;) 
)

Результат будет

#<undef>
11
10

I не мог объяснить, почему опущенные скобки приводят к такому результату. Во втором случае я ожидал, что компилятор обработает cond ((and (< b c) (< b a)) (+ c a)), ((and (< a c) (< a b)) (+ c b)) и ((and (< a c) (< a b)) (+ c b)) как три выражения, два последних недопустимы, вместо этого кажется, что они были выполнены.

1 Ответ

1 голос
/ 03 мая 2020

Обычно ключевое слово cond должно вызывать исключение при его интерпретации.

Но, если ваш интерпретатор не выдает никакой ошибки, вы находитесь в случае оператора блока, в котором выполняется оценка последнего выражения обеспечивает результат, остальные рассчитываются только для побочных эффектов. Код сводится к этому:

(define (f a b c)  ((and (< c b) (< c a)) (+ b  a))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...