На этом шаге мы приведем перечень аппликативных функционалов в muLISP85.
Опишем действие аппликативных функционалов в версии muLISP85.
Передает фактические аргументы (ARG1, ARG2, ... плюс элементы ARGLIST) FUNCTION на машинном языке и возвращает результат работы функции. | |
Осуществляет выполнение действий FUNCTION над аргументами ARG1, ARG2,...,ARGN и возвращает результат. | |
Проверка, является ли аргумент константой. | |
Инициирует прерывание по ошибке "Неопределенная функция". |
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 FN X1 X2...XN)Например:
$ (FUNCALL '+ '2 '3) 5Определите функционал FUNCALL через функционал APPLY в версии muLISP81.
На следующем шаге мы начнем изучение отображающих функционалов.