Скачать .docx |
Реферат: Функції конструктора
Реферат на тему:
Функції конструктора
muLISP-програми можуть автоматично генерувати нові структури даних, використовуючи функції конструктора. Ці функції можуть утворювати бінарні дерева або зв’язні списки, які моделюють структури даних практично для довільної задачі.
1. (CONS object list ). Ця функція конструктора є примітивною функцією та була розглянута раніше у параграфі 2.2.
2. (ACONS key object alist ). Утворює пару (ключ . обьект), розташовує її на початку асоциативного списку alist та повертає результуючий асоциативний список. ACONS спрощує процес утворення асоциативних списків.
(DEFUN ACONS (KEY OBJ ALIST)
(CONS (CONS KEY OBJ) ALIST) )
$ (ACONS 'EYES 'BLUE '((WEIGTH . 170) (HEIGTH . 72)))
((EYES . BLUE) (WEIGTH . 170) (HEIGTH . 72))
3. (LIST object1 object2 ... objectn ). Утворює та видає список, який складається з елементів від об’єкта object1 по об’єкт objectn . Якщо функція викликана без аргументів, то LIST повертає ознаку NIL. LIST може працювати з будь-якою кількістю аргументів.
(DEFUN LIST LST
((NULL LST) NIL)
(CONS (CAR LST) (APPLY 'LIST (CDR LST))) )
$ (LIST 'A 'B 'C 'D) $ (LIST 'A '(B C) 'D)
(A B C D) (A (B C) D)
$ (LIST)
NIL
4. (LIST* object1 object2 ... objectn ). Пов’язує у пару об’єкти object1 , object2 , ... та objectn і видає результуючий об’єкт. Якщо функція викликається з єдиним аргументом, LIST* повертає цей аргумент.
(DEFUN LIST* LST
((NULL LST) NIL)
((NULL (CDR LST))
(CAR LST) )
(CONS (CAR LST) (APPLY 'LIST* (CDR LST))) )
$ (LIST* 'A 'B 'C 'D) $ (LIST* 'A 'B '(C D))
(A B C . D) (A B C D)
$ (LIST* 'DOG)
DOG
5. (APPEND list1 list2 ... listn ). Утворює та повертає список, який складається з елементів списків, починаючи зі списку list1 та по список listn . APPEND копіює cons-и верхнього рівня кожного зі своїх аргументів, окрім останнього. Якщо функція викликається з єдиним аргументом, APPEND повертає цей аргумент без його копіювання. Отже, для копіювання списку краще використовувати COPY-LIST, ніж APPEND.
Відмітимо, що якщо APPEND та NCONC, о якій буде сказано далі, мають однакові аргументи, вони повертають, як правило, одинакові списки. Але APPEND використовує cons-и для копіювання усіх, окрім останнього, аргументів, тоді як NCONC фактично модифікує усі аргументи, окрім останнього.
(DEFUN APPEND (LST1 LST2)
((ATOM LST1) LST2)
(CONS (CAR LST1) (APPEND (CDR LST1) LST2)) )
$ (SETQ FOO '(D E F))
(D E F)
$ (APPEND '(A B C) FOO '(G H I)) $ (APPEND '(I U) 'T 'R 'E '(O I))
(A B C D E F G H I) (I U O I)
$ FOO $ (APPEND '(A B C D) 'E 'F 'G)
(D E F) (A B C D . G)
6. (COPY-LIST list ). Копіює cons-и верхнього рівня списку list та повертає список, еквівалентний (тобто рівний – EQUAL) списку list .
(DEFUN COPY-LIST (LST)
((ATOM LST) LST)
(CONS (CAR LST) (COPY-LIST (CDR LST))) )
$ (COPY-LIST '(A B (C . D) E)) $ (COPY-LIST '(A B C . D))
(A B (C . D) E) (A B C . D)
7. (COPY-TREE object ). Копіює cons-и верхнього рівня об‘єкту object та повертає об‘єкт, еквівалентний object .
(DEFUN COPY-TREE (OBJ)
((ATOM OBJ) OBJ)
(CONS (COPY-TREE (CAR OBJ)) (COPY-TREE (CDR OBJ))) )
$ (COPY-TREE '(A B (C . D) E)) $ (COPY-TREE '(A B C . D))
(A B (C . D) E) (A B C . D)
8. (FIRSTN n list ). Якщо n - додатне ціле, функція копіює та повертає перші n елементів списку. FIRSTN повертає NIL, якщо n - недодатне ціле. Якщо список має n або більше елементів, FIRSTN копіює та повертає елементи списку.
(DEFUN FIRSTN (N LST)
((AND (INTEGERP N) (PLUSP N))
((ATOM LST) NIL)
(CONS (CAR LST) (FIRSTN (SUB1 N) (CDR LST))) ) )
$ (FIRSTN 0 '(SUE JOE ANN BOB)) $ (FIRSTN 2 '(A B . C))
NIL (A B)
$ (FIRSTN 2 '(SUE JOE ANN BOB)) $ (FIRSTN 3 '(A B . C))
(SUE JOE) (A B)
$ (FIRSTN 4 '(SUE JOE ANN BOB))
(SUE JOE ANN BOB)
$ (FIRSTN 5 '(SUE JOE ANN BOB))
(SUE JOE ANN BOB)
9. (BUTLAST list n ). Якщо n - ноль або додатне ціле, функція копіює та повертає усе, окрім n останніх елементів списку list . Якщо n пропущено чи рівне нулю, чи не є додатним цілим, BUTLAST копіює та повертає усе, окрім останнього, елементи списку.
(DEFUN BUTLAST (LST N)
((AND (INTEGERP N) (>=N 0))
(FIRST (-(LENGTH LST) N) LST) )
(BUTLAST LST 1) )
$ (BUTLAST '(A B C D)) $ (BUTLAST '(A B C D) 2)
(A B C) (A B)
10. (REMOVE item list test ). Повртає копію списку list з усіма елементами, окрім тих, які при перевірці за тестом test мають ознаку не NIL та видаляються (тобто (test item element) не дорівнює NIL).
Якщо тест-аргумент дорівнює NIL або не задан, REMOVE використовує EQL-тест.
(REMOVE-IF test list ). Повртає копію списку list з усіма елементами, окрім тих, які при перевірці за тестом test мають ознаку не NIL та видаляються.
(DTFUN REMOVE (ITEM LST TEST)
((ATOM LST) LST)
( ((NULL TEST)
(SETQ TEST 'EQL) ) )
(LET ( (COPY (REMOVE ITEM (CDR LST) TEST)) )
((FUNCALL TEST ITEM (CAR LST)) COPY)
((EQ COPY LST) LST)
(CONS (CAR LST) COPY) ) )
$ (REMOVE '(2 5) '((5 2) (2 5) (2 3)) 'EQUAL)
((5 2) (2 3))
$ (REMOVE-IF 'MINUSP '(-2 0 7 -0.1 3))
(0 7 3)
11. (REVERSE list object ). Утворює та видає список, який складається з елементів списку list , але в оберненому порядку. Функція видає елементи списку в оберненому порядку, приєднані до об’єкту object . Результат є таким, як і при роботі функції (APPEND (REVERSE list ) object ), але виклик REVERSE в якості другого аргумента є більш ефективним.
(DEFUN REVERSE (LST OBJ)
((ATOM LST) OBJ)
(REVERSE (CDR LST) (CONS (CAR LST) OBJ))) )
$ (REVERSE '(A B C D E))
(F D C B A)
$ (REVERSE '(A B C) '(D E F)) $ (REVERSE '(A B C) 'D)
(C B A D E F) (C B A . D)
12. (SUBSTITUTE new old list test ). Повертає копію високого рівня списку list, замінюючи на нові new елементи ті старі old елементи списку, для яких ознака перевірки за тестом test не дорівнює не NIL. Якщо тест-аргумент дорівнює NIL або не задан, SUBSTITUTE використовує EQL-тест.
(SUBSTITUTE-IF new test list ). Повертає копію високого рівня списку list , замінюючи на нові new елементи усі елементи списку, для яких ознака перевірки за тестом не є NIL.
(DEFUN SUBSTITUTE (NEW OLD LST TEST)
((ATOM LST) LST)
( (NULL TEST)
(SETQ TEST 'EQL) ) )
((FUNCALL TEST OLD (CAR LST))
(CONS NEW (SUBSTITUTE NEW OLD (CDR LST) TEST)) )
((SETQ NEW (SUBSTITUTE NEW OLD (CDR LST) TEST))
((EQ NEW (CDR LST)) LST)
(CONS (CAR LST) NEW) )
$ (SUBSTITUTE 5 2 '(4 2 (3 . 2) 4))
(4 5 (3 . 2) 4)
$ (SUBSTITUTE 'CANNIBALS 'NOUN '(NOUN LIKE TO EAT NOUN) )
(CANNIBALS LIKE TO EAT CANNIBALS)
13. (SUBST new old object test ). Повертає копію об’єкта object , замінюючи на нові new усі старі old підвирази об’єкта, для яких ознака перевірки за тестом test не дорівнює NIL. Якщо тест-аргумент дорівнює NIL або не задан, SUBST використовує EQL-тест.
(SUBST-IF new test object ). Повертає копію високого рівня об’єкта object , замінюючи на нові new елементи усі підвирази об’єкта, для яких ознака перевірки за тестом не є NIL.
(DEFUN SUBST (NEW OLD OBJ TEST)
( (NULL TEST)
(SETQ TEST 'EQL) ) )
((FUNCALL TEST OLD OBJ) NEW)
((ATOM OBJ) OBJ)
(LET ( (LEFT (SUBST NEW OLD (CAR OBJ) TEST))
(RIGHT (SUBST NEW OLD (CDR OBJ) TEST)) )
((AND (EQ LEFT (CAR OBJ)) (EQ RIGHT (CDR OBJ)))
OBJ )
(CONS LEFT RIGHT) ) )
$ (SUBST 5 2 '(4 2 (3 . 2) 4))
(4 5 (3 . 5) 4)