РефератыАстрономияФуФункції конструктора

Функції конструктора

Реферат на тему:


Функції конструктора


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))

p>

(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)

Сохранить в соц. сетях:
Обсуждение:
comments powered by Disqus

Название реферата: Функції конструктора

Слов:1334
Символов:9316
Размер:18.20 Кб.