WWW.REFERATCENTRAL.ORG.UA - Я ТУТ НАВЧАЮСЬ

... відкритий, безкоштовний архів рефератів, курсових, дипломних робіт

ГоловнаІнформатика, Компютерні науки → Функції виводу - Реферат

Функції виводу - Реферат

то їй аргументи передаються без обчислення - так, як вони стоять в рядку виклику. Пояснимо це на прикладі. Визначимо дві функції f1 та f2, які на перший погляд однакові:
(DEFUN f1 (LAMBDA (x y) (DEFUN f2 (NLAMBDA (x y)
(+ x y)) ) (+ x y)) )
Якщо викликати (f1 5 6) або (f2 5 6), то результат буде однаковим - 11.
Нехай змінним k та l присвоєнідеякі значення: (SETQ k 5 l 6). Тоді
$ (f1 k l) $ (f2 k l)
11 помилка: (+ k l) / а не (+ 5 6), оскільки передані
аргументи не обчислені /
Функція типу MACRO називається макро-функцією. Макроси є потужним робочим інструментом програмування. Синтаксис визначення макроса виглядає таким же чином як синтаксис визначення функції форми DEFUN:
(DEFMACRO )
Виклик макроса співпадає за формою з викликом функцї, але його обчислення відрізняється від обчислення виклику функції. В макросі не обчислюються аргументи. Обчислення виклику макроса складається з двох послідовних етапів. Спочатку відбувається обчислення тіла з аргументами (як і для функції). Цей етап називається розширенням або розкриттям макроса. На другому етапі обчислюється розкрита форма, значення якої повертається в якості значення всього макровиклику. Визначимо макрос PUSH1, який працює як відома нам функція PUSH (в дійсності PUSH є вмонтованим в середовище Лісп макросом).
$ (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:
$ (GETD 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))
(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)) введення виразу
(SETQ v (EVAL e)) обчислення виразу
(PRINT v) друк результата
При виконанні тіла необчислювальної функції ми можемо використати функцію EVAL для обчислення аргументів.
(DEFUIN f3 (NLAMBDA (x y) (SETQ k 5 l 6) (f3 k l)
(+ (EVAL x) (EVAL y))) ) 11
3. CONSTANTP
Об'єкт є константою тоді і тільки тоді, коли (EVAL ) повертає . Символ NIL, числа та списки, в яких CAR-елемент є символ QUOTE, в muLisp є константами. Якщо - константа, функція CONSTANTP повертає Т, інакше - NIL.
(DEFUN CONSTANTP (obj)
((NULL obj))
((NUMBERP obj))
((ATOM obj) NIL)
(EQ (CAR obj) 'QUOTE) )
$ (CONSTANTP ()) $ (CONSTANTP 23.543)
T T
$ (CONSTANTP 'v) $ (CONSTANTP '(a b c))
NIL NIL
$ (CONSTANTP '(QUOTE (a b c)))
T
4. APPLY ...
Застосовує функцію до списку аргументів. (APPLY f x1 x2 ... xN) еквівалентно (f x1 x2 ... xN). Використання функції APPLY є більщ гнучким у порівнянні з прямим викликом функції. Діє як і функція FUNCALL, тільки аргументи функції приймає не окремо, а списком.
Якщо функція - ім'я визначеної користувачем функції або тіло LAMBDA, APPLY пов'язує формальні аргументи функції з фактичними аргументами, обчислює тіло функції, відтворює вихідні значення формальних аргументів і повертає значення обчислення тіла функції.
Якщо функція - не ім'я функції і не тіло LAMBDA, APPLY генерує переривання по помилці "невизначена функція".
$ (APPLY 'CONS '(a (b c d))) $ (SETQ z '(LAMBDA (n) (* n n)))
(a b c d) $ (APPLY z '(4))
16
5. UNDEFINED ...
Ця функція ініціює преривання по помилці "Невизначена функція". Ця функція керування помилками використовується тоді, коли намагаються обчислити форму, CAR-елемент якої є символом, який не має визначення функції.
Loading...

 
 

Цікаве