Шаг 21.
Аппликативные функционалы в muLISP85

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

    Опишем действие аппликативных функционалов в версии muLISP85.

Таблица 1. Аппликативные функционалы muLISP85
Функция
Назначение
(APPLY FUNCTION ARG1 ARG2... ARGLIST)
Передает фактические аргументы (ARG1, ARG2, ... плюс элементы ARGLIST) FUNCTION на машинном языке и возвращает результат работы функции.
(FUNCALL FUNCTION ARG1 ARG2...ARGN)
Осуществляет выполнение действий FUNCTION над аргументами ARG1, ARG2,...,ARGN и возвращает результат.
(CONSTANTP OBJECT)
Проверка, является ли аргумент константой.
(UNDEFINED SYMBOL FORM1 FORM2...FORMN)
Инициирует прерывание по ошибке "Неопределенная функция".

    1. Если FUNCTION есть название действия на машинном языке, то функция (APPLY FUNCTION ARG1 ARG2...ARGLIST) передает фактические аргументы (ARG1, ARG2, ... плюс элементы ARGLIST) FUNCTION на машинном языке и возвращает результат работы функции.

    Если FUNCTION - имя определенной пользователем функции или тело LAMBDA, то функция APPLY связывает формальные аргументы функции FUNCTION с фактическими аргументами (ARG1, ARG2,... плюс элементы ARGLIST), вычисляет тело функции, востанавливает первоначальное значение формальных аргументов и возвращает значение вычисления тела функции. Например:


   $ (APPLY 'CONS '(A (B C D)))
   (A B C D)
   $ (APPLY '(LAMBDA (N) (* N N)) '(5))
   25

    Если функция FUNCTION не является именем функции или телом функции LAMBDA, то APPLY генерирует прерывание по ошибке "Неопределенная функция".

В начало таблицы

    2. Если функция (FUNCALL FUNCTION ARG1 ARG2...ARGN) осуществляет выполнение действий FUNCTION над аргументами ARG1, ARG2,...,ARGN и возвращает результат. Функция FUNCTION должна быть именем вычисляемой или невычисляемой функции, или телом функции LAMBDA. Например:


   $ (FUNCALL 'CONS 'A '(B C D))
   (A B C D)
   $ (FUNCALL '(LAMBDA (N) (* N N)) 5)
   25

    Если функция FUNCTION - это имя макро или неопределенной функции, то возникает прерывание по ошибке "Неопределенная функция".

    Приведем код функции:


   (DEFUN FUNCALL (FUNC ARG1 ARG2...ARGN)
      (APPLY FUNC ARG1 ARG2...ARGN NIL)
   )
В начало таблицы

    3. Если OBJECT - константа, то функция (CONSTANTP OBJECT) возвращает Т, иначе - NIL. Например:


   $ (CONSTANTP ())    $ (CONSTANTP -237.6)
   T                   T
   $ (CONSTANTP 'T)    $ (CONSTANTP '(QUOTE (A B C)))
   NIL                 T

    Заметим, что OBJECT является константой тогда и только тогда, когда функция (EVAL OBJECT) возвращает OBJECT.

    Символ NIL, числа и списки, у которых CAR-элемент есть символ QUOTE, рассматриваются в muLISP как константы.

    Код функции имеет вид:


   (DEFUN CONSTANTP (OBJ)
      ( (NULL OBJ) )
      ( (NUMBERP OBJ) )
      ( (ATOM OBJ) NIL )
      ( EQ (CAR OBJ) 'QUOTE )
   )
В начало таблицы

    4. Функция (UNDEFINED SYMBOL FORM1 FORM2...FORMN) инициирует прерывание по ошибке "Неопределенная функция", осуществляя вызов функции:


   (BREAK (LIST SYMBOL FORM1 FORM2...FORMN)
          '"Undefined Function")

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

    Код функции очевиден:


   (DEFUN UNDEFINED LST
      (BREAK LST '"Undefined Function") )


Функционал FUNCALL по своему действию аналогичен функционалу APPLY, но аргументы для вызываемой функции он принимает не списком, а "по отдельности". Синтаксис функционала:

               (FUNCALL FN X1 X2...XN)
Например:

   $ (FUNCALL '+ '2 '3)
   5
Определите функционал FUNCALL через функционал APPLY в версии muLISP81.
В начало таблицы

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




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