Шаг 13.
Управляющая структура COND

    На этом шаге мы рассмотрим одну из основных управляющих структур 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 явно свидетельствует о том, что должно сработать последнее предложение, если все остальные не срабатывают.


    Пример 1.

   (COND ( (EQ N 0) 1 )
         ( (EQ N 1) N )
         ( (EQ N 2) (TIMES M M) )
   )


    Пример 2. Проверить, содержится ли заданный элемент X в заданном списке LST, и если нет, то добавить этот элемент к списку.

       (COND ( (MEMBER X LST) T )
             (  T  (CONS X LST) )
       )
(см. MEMBER,   CONS)


    Пример 3. Статистика показывает, что в текстах реальных программ обращения к функции CAR встречаются в среднем на 10% (иногда до 40%) чаще, чем обращения к функции CDR. Причину такого предпочтения можно объяснить, например, тем, что функция F, работающая со списками, часто имеет следующую структуру:

   (COND  ( (NULL L) NIL)
          ( (P (CAR L)) (G (CAR L)) )
          (       T     (F (CDR L)) ) )
   )


    Замечания. 1. В условном предложении может отсутствовать результирующее выражение Ai или на его месте может находиться новая функция COND:

   (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)



    На следующем шаге мы поговорим о функциях пользователя.




Предыдущий шаг Содержание Следующий шаг