Функції виводу, Детальна інформація

Функції виводу
Тип документу: Реферат
Сторінок: 5
Предмет: Культура
Автор: Олексій
Розмір: 10.7
Скачувань: 779
При програмуванні розкритого макроса явно не видно, тому для їх тестування існує спеціальна функція – MACROEXPAND, яка здійснює тільки розкриття макроса. Повертається макророзширення виклику, яке можна вивчати.

$ (MACROEXPAND '(PUSH1 6 s))

(SETQ S (CONS 6 S))

CADR-елементом визначення функції є або список формальних аргументів, або ім’я формального аргументу. Функція, яка визначена за допомогою списку формальних аргументів, в тому числі і порожнього, називається розгорнутою. При виклику такої функції фактичні аргументи прив’язуються відповідно до формальних аргументів.

Функція, яка визначена за допомогою імені формального аргумента, називається нерозгорнутою. Якщо викликається така функція, список фактичних аргументів пов’язується з іменем формального аргумента. Отже нерозгорнуті функції допускають будь-які імена фактичних аргументів.

CDDR-елементом визначення функції є список форм, який називається тілом функції. Після того як формальні аргументи функції були прив’язані з її фактичними, починає працювати неявна функція PROGN, яка обчислює тіло функції. Після обчислення тіла функції формальні аргументи знову приймають свої вихідні значення, а результат обчислення тіла функції видається як значення функції.

1. FUNCALL (<функція> ... )

Виконуються дії функції <функція> над аргументами та повертається результат. <Функція> повинна бути або іменем обчислюваної функції, або тілом LAMBDA. Якщо <функція> — це ім’я макро або невизначеної функції, виникає переривання по помилці <невизначена функція>.

$ (FUNCALL ‘CONS ‘a ‘(b c d))

(a b c d)

$ (FUNCALL ‘(LAMBDA (n) (* n n)) 5)

25

2. EVAL <об’єкт>

Інтерпретатор Ліспа називається EVAL, його можна як і інші функції викликати з програми. У звичайній роботі інтерпретатор викликати не має потреби, оскільки його виклик має місце неявно. Зайвий виклик інтерпретатора може зняти ефект блокування (QUOTE), або дозволить знайти значення виразу. EVAL – це універсальна функція Ліспа, яка може обчислити довільний правильно побудований лісповський вираз.

Якщо об’єкт — атом, функція повертає зміст комірки значення об’єкту.

Якщо CAR-елемент об’єкта є іменем обчислюваної функції або LAMBDA, функція обчислює кожний елемент CDR-частини об’єкта і додає CAR-елемент об’єкта до списку результатів.

Якщо CAR-елемент об’єкта є іменем необчислюваної функції, EVAL додає CAR-елемент об’єкта до CDR-елемента об’єкта без обчислення останнього.

Якщо CAR-елемент об’єкта є макрофункцією, EVAL рекурсивно обчислює результат додавання CAR-елемента об’єкта до його CDR-елемента.

Якщо CAR-елемент об’єкта не є функцією, EVAL повертає помилку “невизначена функція” та генерує переривання по помилці.

$ (SETQ a ‘b b ‘c) $ (EVAL ‘(CONS ‘A ‘(B C)))

$ (EVAL a) (A B C)

c

$ (EVAL ‘(PRIN1 ‘(a b c)))

(a b c) (a b c)

$ (DEFUN a (n) $ (EVAL ‘(a 3))

(+ n 2) ) 5

$ (EVAL (LAMBDA (n) (* n n)) 7)

49

Діалог з інтерпретатором Ліспа на верхньому (командному) рівні можна описати простим циклом:

(SETQ e (READ)) введення виразу

The online video editor trusted by teams to make professional video in minutes