Шаг 27.
Функционалы планирования функций

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

    Функционалы планирования функций, которые будут рассмотрены в данном разделе, осуществляют выполнение тестовых функций над элементами одного или нескольких списков до тех пор, пока не встретится "критерий окончания" или конец какого-либо из списков. Критерий окончания основывается на истинном значении, возвращаемом тестовой функцией. Отметим, что функционалы планирования являются предикатами.

    Функционалы планирования имеются только в диалектах muLISP85 и muLISP87.

Таблица 1. Функционалы планирования функций
Функция
Назначение
(SOME TEST LIST1...LISTN)
Выполняет действия предиката TEST над CAR-элементами списков LIST1,...,LISTN, затем - над CADR-обьектами каждого списка и т.д. до тех пор, пока тест не вернет значение, отличное от NIL, или не встретится конец списка.
(NOTANY TEST LIST1...LISTN)
Выполняет действия предиката TEST над CAR-элементами списков LIST1,...,LISTN, затем - над CADR-обьектами каждого списка и т.д. до тех пор, пока тест не вернет значение, отличное от NIL, или не встретится конец списка.
(EVERY TEST LIST1...LISTN)
Выполняет действия предиката TEST над CAR-элементами списков LIST1,...,LISTN, затем - над CADR-обьектами каждого списка и т.д. до тех пор, пока тест не вернет NIL, или не встретится конец списка.
(NOTEVERY TEST LIST1...LISTN)
Выполняет действия предиката TEST над CAR-элементами списков LIST1,...,LISTN, затем - над CADR-обьектами каждого списка и т.д. до тех пор, пока тест не вернет NIL, или не встретится конец списка.
REDUCE FUNC LIST
Последовательно преобразует элементы списка LIST к простому значению, используя функцию FUNC - функцию двух аргументов.

    1. Функция (SOME TEST LIST1 ... LISTN) выполняет действия предиката TEST над CAR-элементами списков LIST1,...,LISTN, затем - над CADR-обьектами каждого списка и т.д. до тех пор, пока тест не вернет значение, отличное от NIL, или не встретится конец списка.

    Если тест возвращает значение, отличное от NIL, функция SOME возвращает это значение, если же конец списка достигнут, функция SOME возвращает NIL. Например:


   $ (SOME 'EQL '(DOG CAT COW) '(COW CAT DOG))
   T
   $ (SOME 'PLUSP (LIST 0 -3 (+4 -6)))
   NIL
Приведем код функции:
   (DEFUN SOME (TST LST1 LST2)
      (LOOP
          ( (OR (NULL LST1) (NULL LST2)) NIL )
          ( (FUNCALL TST (POP LST1) (POP LST2)) )
      )
   )
В начало таблицы

    2. Функция (NOTANY TEST LIST1...LISTN) выполняет действия предиката TEST над CAR-элементами списков LIST1,...,LISTN, затем - над CADR-обьектами каждого списка и т.д. до тех пор, пока тест не вернет значение, отличное от NIL, или не встретится конец списка.

    Если тест возвращает значение, отличное от NIL, функция NOTANY возвращает NIL, если же конец списка достигнут, функция NOTANY возвращает T. Например:


   $ (NOTANY 'EQL '(DOG CAT COW) '(COW CAT DOG))
   NIL
   $ (NOTANY 'ODDP (LIST 0 (+3 3) 7/2))
   T
Приведем код функции:
   (DEFUN NOTANY (TST LST1 LST2)
      (NOT (SOME TST LST1 LST2))
   )
В начало таблицы

    3. Функция (EVERY TEST LIST1 ... LISTN) выполняет действия предиката TEST над CAR-элементами списков LIST1,...,LISTN, затем - над CADR-обьектами каждого списка и т.д. до тех пор, пока тест не вернет NIL, или не встретится конец списка.

    Если тест возвращает NIL, функция EVERY возвращает NIL, если же конец списка достигнут, функция EVERY возвращает T. Например:


   $ (EVERY 'EQL '(DOG CAT COW) '(DOG CAT PIG))
   NIL
   $ (EVERY 'ODDP (LIST 3 5 7 11 13))
   T
Приведем код функции:
   (DEFUN EVERY (TST LST1 LST2)
      (LOOP
          ( (OR (NULL LST1) (NULL LST2)) NIL )
          ( (NOT (FUNCALL TST (POP LST1) (POP LST2))) T )
   )
В начало таблицы

    4. Функция (NOTEVERY TEST LIST1 ... LISTN) выполняет действия предиката TEST над CAR-элементами списков LIST1,...,LISTN, затем - над CADR-элементами каждого списка и т.д. до тех пор, пока тест не вернет NIL, или не встретится конец списка.

    Если тест возвращает NIL, функция NOTEVERY возвращает T, если же конец списка достигнут, функция NOTEVERY возвращает NIL. Например:


   $ (NOTEVERY 'EQL '(DOG CAT COW) '(DOG CAT PIG))
   T
   $ (NOTEVERY 'STRING< '(BILL JACK JOE) '(BUD JIM SUE))
   NIL
Код функции очевиден:
   (DEFUN NOTEVERY (TST LST1 LST2)
      (NOT (EVERY TST LST1 LST2))
   )
В начало таблицы

    5. Функция (REDUCE FUNC LIST) последовательно преобразует элементы списка LIST к простому значению, используя функцию FUNC - функцию двух аргументов.

    Преобразование осуществляется слева направо.

    Функция (REDUCE FUNC LIST INITIAL) преобразует элементы списка LIST, принимая INITIAL за начальное значение. Например:


   $ (REDUCE 'CONS '(A B C D))  $ (REDUCE '* '(2 3 5 7) -2)
   (((A . B) . C) . D)          -420
   $ (REDUCE '* '(2 3 5 7))     $ (REDUCE '* NIL)
   210                          1
   $ (REDUCE '* '(1 2 3 4 5))   $ (REDUCE 'LIST '(1 2 3 4 5))
   120   % 5!=120               ((((1 2) 3) 4) 5)
   $ (REDUCE 'LIST '(1 2 3 4 5) '(A B C))
   ((((((A B C) 1) 2) 3) 4) 5)
В начало таблицы

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




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