Шаг 20.
Аппликативные функционалы. Функция APPLY

    На этом шаге мы введем понятие аппликативных функционалов.

    Одним из основных типов функционалов являются функции, которые позволяют вызывать другие функции, иными словами, применять функциональный аргумент к его параметрам. Такие функционалы называют аппликативными (применяющими) функционалами.

    Применяющие функционалы родственны универсальной функции языка LISP EVAL. В то время как EVAL вычисляет значение произвольного выражения, применяющий функционал вычисляет значение вызова некоторой функции.

    Функция APPLY является функцией двух аргументов, из которых первый аргумент представляет собой функцию, которая применяется к элементам списка, составляющим второй аргумент функции APPLY: (APPLY FN Список). Например:


   $ (APPLY PLUS (2 3))
   5

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


   $ (APPLY (CAR (PLUS - * /)) (2 3))
   5


    Пример 1. Определите функционал (APL-APPLY F X), который применяет каждую функцию Fi списка F = (F1 F2 ...FN) к соответствующему элементу Xi списка X = (X1 X2 ... XN) и возвращает список, сформированный из результатов.

   (DEFUN APL-APPLY (LAMBDA (F X)    % F и X - списки %
      (COND ( (NULL F) NIL )
            (    T    (CONS (APPLY (CAR F) (LIST (CAR X)))
                            (APL-APPLY (CDR F) (CDR X))) )
      )
   ))


    Пример 2. Основной интерфейс пользователя с muLISP обеспечивается функцией цикла "чтение-вычисление-печать" DRIVER:

   (DEFUN DRIVER (LAMBDA (RDS WRS)
      (LOOP
         (TERPRI) (PRIN1 (QUOTE "> "))
         (PRINT (APPLY (READ) (READ) (TERPRI)))
      )
   ))
   (DRIVER)


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




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