На этом шаге мы рассмотрим одну из основных управляющих структур COND.
Функция COND ("CONDition" - "условие") является основным средством разветвления вычислений.
Структура условного выражения такова:
(COND (P1 A1)
(P2 A2)
...
(PN AN)
)
Здесь (P1 A1),...,(PN AN) - аргументы функции COND. Значение функции
COND определяется следующим образом.
1. Выражения Pi, выполняющие роль предикатов, вычисляются последовательно слева направо (сверху вниз) до тех пор, пока не встретится выражение, значением которого не является NIL (заметим, что не требуется строгое T!).
2. Вычисляется выражение Ai, соответствующее этому предикату Pi, и полученное значение возвращается в качестве значения функции COND.
3. Если все Pi (i=1,2,...,N) возвращают NIL, то значением функции COND будет NIL.
Рекомендуется в качестве последнего PN использовать символ T, и соответствующее ему результирующее выражение будет вычисляться всегда в тех случаях, когда ни одно другое условие не выполняется. Хотя на самом деле T не является необходимым, так как тот же самый результат получится и без него.
Хорошая программистская практика говорит за использование T, потому что присутствие T явно свидетельствует о том, что должно сработать последнее предложение, если все остальные не срабатывают.
(COND ( (EQ N 0) 1 ) ( (EQ N 1) N ) ( (EQ N 2) (TIMES M M) ) )
(COND ( (MEMBER X LST) T ) ( T (CONS X LST) ) )(см. MEMBER, CONS)
(COND ( (NULL L) NIL) ( (P (CAR L)) (G (CAR L)) ) ( T (F (CDR L)) ) ) )
(COND (P1 A11) ... (Pi) ... (Pk AN1 AN2 ... ANk) )
Если условию не ставится в соответствие результирующее выражение, то в качестве результата функции COND при истинности предиката возвращается само значение предиката.
Если же условию соответствует несколько результирующих выражений, то при его истинности результирующие выражения вычисляются последовательно слева направо и результатом функции COND будет значение последнего выражения последовательности. Ясно, что любые выражения, стоящие между первым и последним элементами в списке функции COND, должны использоваться только из-за побочных эффектов, поскольку никоим образом они не могут повлиять на значение COND.
2. Функцию COND часто подвергается критике за обилие скобок. Поэтому в разных LISP-системах используются и другие, в различных отношениях более естественные, условные предложения.
Например, среди положительных черт диалекта muLISP является конструкция,
которая получила название встроенный COND.
Используя встроенный COND, вы можете существенно сократить записи при организации
ветвления в программе. Запись:
(COND (Pred1 Expr1.1 Expr1.2 ... Expr1.A)
(Pred2 Expr2.1 Expr2.2 ... Expr2.B)
... ...
( T ExprN.1 ExprN.2 ... ExprN.K)
)
можно сократить так:
(Pred1 Expr1.1 Expr1.2 ... Expr1.A)
(Pred2 Expr2.1 Expr2.2 ... Expr2.B)
... ... ...
( ExprN.1 ExprN.2 ... ExprN.K)
На следующем шаге мы поговорим о функциях пользователя.