cond
- это способ сделать if-elseif * -почему в lisp и получить более плоскую структуру, чем при вложенности if
. Поскольку cond
является производной формой, вы можете написать условное выражение в терминах if
. Ваша процедура будет выглядеть так:
(define (abs x)
(if (< x 0)
x
(if (= x 0)
0
(if +
(begin
1
2
1001)))))
Последний if
проверяет, является ли +
правдивым. Каждое выражение , которое не оценивается как #f
, является правдивым, поэтому все процедуры являются ложными. Затем он будет оценивать каждую часть 1
, 2
, затем 1001
, и, поскольку это хвостовое выражение, является результатом оценки. Вы можете иметь столько же последствий в каждом семестре cond
, но все до хвоста только для эффекта.
Вы можете добавить одну дополнительную пару скобок, и она будет работать так, как вы ожидали:
(define (abs x)
(cond ((< x 0) x)
((= x 0) 0)
((+ 1 2 1001))))
Здесь нет никаких зависимостей, и истинный результат предиката является результатом для (abs 1)
. Хотелось бы, чтобы код был как можно более понятным, поэтому использование else
является гораздо лучшим вариантом:
(define (abs x)
(cond ((< x 0) x)
((= x 0) 0)
(else (+ 1 2 1001))))
Это также помогает при другой проблеме. Хотя число всегда является правдивым, если вы выполняете трюк с предикатом с чем-то, что может быть #f
, результат не определен в spe c. Таким образом:
(cond ((other-proc x)))
; ==> ??
Если вызов other-proc
правдив, результат таков, что если он равен #f
, вы получите результат, выбранный исполнителями. Это почти всегда правдивые значения с сумасшедшими визуализациями, такими как #<undefined>
, но могут быть что-то вроде "BaNaNa"
или даже #f
. Таким образом, разумно иметь термин else
, чтобы вы, а не какой-либо другой разработчик, могли выбрать результат: -)