В языке ЛИСП предусмотрено более чем триста встроенных функций, подобных базовым. Но независимо от их количества всегда возникает необходимость в новых функциях, определенных пользователем. Назначить имя и определить новую функцию можно с помощью специальной формы DEFUN (define function). Конструкция DEFUN имеет следующую структуру
(DEFUN <имя функции> (список формальных параметров)
<тело функции>
)
Тело функции состоит из одного или нескольких последовательных s-выражений (заданий). Описание функции должно всегда предшествовать обращению к ней (вызову). Так, функция, которая проверяет, является ли данный объект пустым списком, может быть определена так
(DEFUN NULL (obj)
(EQL obj NIL)
)
Ее вызов имеет вид
(NULL ‘(a b c d)) F (NULL (CDR ‘(f))) T
Тело функции состоит из последовательности заданий. Задания могут быть двух типов: простые и условные. Любое задание берется в круглые скобки и может рассматриваться как список выражений, которые надо проинтерпретировать.
Если задание является атомом или его первый элемент является атомом, то такая задача называется простой. Например,
|
|
(CONS 'NR LST).
Если первый элемент списка, который описывает задание, не является атомом, то такое задание называется условным. Например,
((ATOM lst) (CONS expr lst)).
В условном задании первый элемент списка обязательно является предикатом. Если значение предикату NIL, то значение задания становится равным NIL и Лисп переходит к выполнению следующего задания. Если предикат возвращает не NIL, происходит выполнение хвоста списка задания, а другие задания игнорируются. Если предикат возвращает Т, а хвост задания пустой, то результатом всей функции будет T.
Например,
(defun max-min (l)
((atom l) 0)
(setq a (max l))
(setq b (min l))
(- a b)
)