Вы напишете условие, которое выбирает решение и возвращает его списком.
Вы также предскажете, какие выражения вычисляют if, and, or и cond.
Сначала прочитайте раздел Код и есть данные. Запускайте каждый пример отдельно на площадке, чтобы увидеть результат.
Сохраните данные цитированием
(+ 1 2)Результат
3Это выражение вызывает +. Апостроф возвращает список как данные.
'(+ 1 2)Результат
(+ 1 2)Для фиксированных данных используйте quote.
Чтобы создать список из вычисленных аргументов, используйте list.
(list 'decision 'keep)Результат
(decision keep)Здесь оба аргумента возвращают символы. Можно также передать выражения, вычисляющие элементы, как в предыдущем уроке.
Выберите один из двух результатов с if
(if (< 1 2)
'(decision next-page)
'(decision keep))Результат
(decision next-page)После if идут проверка и два выражения результата. Одна оставшаяся строка меньше двух, поэтому выбирается '(decision next-page). Вычисляется только эта ветвь.
Ложным считается только #f. Число 0, пустая строка "" и пустой список ()
считаются истинными. Чтобы проверить, положительно ли число или пуст ли список,
используйте предикат, то есть процедуру, возвращающую #t или #f.
Остановите вычисление раньше с and и or
(and (> 5 1)
(not #f))Результат
#t(> 5 1) возвращает #t, поэтому and вычисляет и (not #f).
Результат этой части тоже #t.
not возвращает #t для #f и #f для любого другого значения.
and вычисляет выражения слева направо и останавливается на первом #f.
or также движется слева направо, но останавливается на первом значении, отличном от #f.
Последующие выражения пропускаются. Это называется сокращённым вычислением.
(or #f 'standard)Результат
standardor проходит мимо #f и возвращает символ standard.
При наличии аргументов and и or возвращают значение, на котором остановились.
Если ранней остановки не было, возвращается значение последнего аргумента.
Эти значения не преобразуются в булевы.
Выберите один из нескольких случаев с cond
(define (heading-decision lines-left chapter-heading?)
(cond
((< lines-left 2) '(decision next-page))
(chapter-heading? '(decision new-chapter))
(else '(decision keep))))
(heading-decision 5 #t)Результат
(decision new-chapter)cond проверяет случаи сверху вниз. При пяти оставшихся строках первая проверка ложна. Признак заголовка главы истинен, поэтому выбирается new-chapter. Если строк меньше двух, сначала выбирается next-page. Если обе проверки ложны, else выбирает keep. Символ decision обозначает вид ответа.
Разберите список
(define answer '(decision keep))
(list (car answer) (car (cdr answer)))Результат
(decision keep)Для непустого списка car возвращает первый элемент, а cdr возвращает оставшийся список.
Здесь (car answer) возвращает decision.
(car (cdr answer)) возвращает keep. list снова объединяет два значения.
При написании правила по возможности создавайте результат напрямую. Если вы часто извлекаете одну и ту же часть списка, отдельная процедура с понятным именем сделает код легче для чтения.
Упражнение
Напишите margin-decision, чтобы оставить поле не меньше 18 мм и расширить меньшее.
Показать один ответ
(define (margin-decision margin-mm)
(if (>= margin-mm 18)
'(decision keep)
'(decision widen narrow-margin)))
(margin-decision 17)Результат равен (decision widen narrow-margin).
Объясните разницу между '(decision keep) и (decision keep) и назовите три части if.
Перейдите к разделу Первое решающее правило,
чтобы собрать из изученного полное правило.