Породження комбінаторних об’єктів
$ (DEFMACRO PUSH1 (x y)$ (SETQ ‘a ‘(1 2 3)) (PUSH1 6 ‘a)
(LIST 'SETQ y (LIST 'CONS x y)))після чого a = (6 1 2 3)
Визначимо деяку функцію P, тілом якої є макрос PUSH1:
(DEFUN p (x y)
(PUSH1 x y))
Тепер за допомогою команди (GETD p) можна побачити, який вигляд має функця p:
(LAMBDA (X Y) (SETQ Y (CONS X Y)))
При програмуванні розкритого макроса явно не видно, тому для їх тестування існує спеціальна функція – MACROEXPAND, яка здійснює тільки розкриття макроса. Повертається макророзширення виклику, яке можна вивчати.
$ (MACROEXPAND '(PUSH1 6 s))
(SETQ S (CONS 6 S))
CADR-елементом визначення функції є або список формальних аргументів, або ім’я формального аргументу. Функція, яка визначена за допомогою списку формальних аргументів, в тому числі і порожнього, називається розгорнутою. При виклику такої функції фактичні аргументи прив’язуються відповідно до формальних аргументів.
Функція, яка визначена за допомогою імені формального аргумента, називається нерозгорнутою. Якщо викликається така функція, список фактичних аргументів пов’язується з іменем формального аргумента. Отже нерозгорнуті функції допускають будь-які імена фактичних аргументів.CDDR-елементом визначення функції є список форм, який називається тілом функції. Після того як формальні аргументи функції були прив’язані з її фактичними, починає працювати неявна функція PROGN, яка обчислює тіло функції. Після обчислення тіла функції формальні аргументи знову приймають свої вихідні значення, а результат обчислення тіла функції видається як значення функції.
1. FUNCALL (<функція>
Виконуються дії функції <функція> над аргументами та повертається результат. <Функція> повинна бути або іменем обчислюваної функції, або тілом LAMBDA. Якщо <функція> — це ім’я макро або невизначеної функції, виникає переривання по помилці <невизначена функція>.
$ (FUNCALL ‘CONS ‘a ‘(b c d)) $ (FUNCALL ‘(LAMBDA (n) (* n n)) 5)
(a b c d)25
2. EVAL <об’єкт>
Інтерпретатор Ліспа називається EVAL, його можна як і інші функції викликати з програми. У звичайній роботі інтерпретатор викликати не має потреби, оскільки його виклик має місце неявно. Зайвий виклик інтерпретатора може зняти ефект блокування (QUOTE), або дозволить знайти значення виразу. EVAL – це універсальна функція Ліспа, яка може обчислити довільний правильно побудований лісповський вираз.
Якщо об’єкт — атом, функція повертає зміст комірки значення об’єкту.
Якщо CAR-елемент об’єкта є іменем обчислюваної функції або LAMBDA, функція обчислює кожний елемент CDR-частини об’єкта і додає CAR-елемент об’єкта до списку результатів.