На этом шаге мы рассмотрим функции для построения очереди.
В версиях muLISP83, muLISP85 и muLISP87 существуют две функции для построения очереди: TCONC и LCONC.
Функция (TCONC PAIR OBJECT) добавляет обьект языка LISP OBJECT в конец списка, CAR-элемент которого указывает на точечную-пару PAIR. Список модифицируется. Функция TCONC возвращает точечную пару PAIR и модифицированный CDR-элемент, указывающий на новый конец списка.
Функция TCONC добавляет элементы в конец списка, используя функцию RPLACD для модификации списка. Его первым аргументом яаляется точечная пара, CAR-элемент которой указывает на начало списка, а CDR-элемент - на конец (на последнюю точечную пару) списка. Вторым аргументом является элемент, который был добавлен в конец списка. Как показано на примере, если функция TCONC вызывается в первые, ее первым аргументом должен быть NIL или список (NIL).
Функция TCONC может буть представлена так:
(DEFUN TCONC (PAIR OBJ) (SETQ OBJ (LIST OBJ)) ( (ATOM PAIR) (CONS OBJ OBJ) ) ( (ATOM (CDR PAIR)) (RPLACA PAIR OBJ) (RPLACD PAIR OBJ) ) ( RPLACD (CDR PAIR) OBJ ) ( RPLACD PAIR OBJ ) )
Тестовые примеры:
$ (SETQ FOO NIL) $ (SETQ FOO (CONS NIL)) NIL (NIL) $ (SETQ FOO (TCONC FOO 'A)) $ (TCONC FOO 'A) ((A) A) ((A) A) $ (TCONC FOO 'B) $ (TCONC FOO 'B) ((A B) B) ((A B) B) $ (TCONC FOO 'C) $ (TCONC FOO 'C) ((A B C) C) ((A B C) C) $ (CAR FOO) $ (CAR FOO) (A B C) (A B C)
Функция (LCONC PAIR LIST) добавляет список LIST в конец списка, на который указывает CAR-элемент точечной пары PAIR, путем модификации списка. Функция LCONC возвращает точечную пару, чей СDR-элемент модифицируется и указывает на новый конец списка. Функция LCONC добавляет новые списки в хвостовой конец списка, используя RPLACD для модификации списка. Ее первым аргументом является точечная пара, CAR-элемент которой указывает на начало списка, а CDR-элемент - на конец (т.е. на последнюю точечную пару) списка. Вторым аргументом функции LCONC является элемент, который был добавлен в конец списка.
Как показано на примерах, при первоначальном вызове LCONC первым ее аргументом будет атом NIL или список (NIL). Например:
$ (SETQ FOO NIL) $ (SETQ FOO (CONS NIL)) NIL (NIL) $ (SETQ FOO (LCONC FOO '(A B))) $ (LCONC FOO '(A B)) ((A B) B) ((A B) B) $ (LCONC FOO '(C D)) $ (LCONC FOO '(C D)) ((A B C D) D) ((A B C D) D) $ (LCONC FOO '(E F)) $ (LCONC FOO '(E F)) ((A B C D E F) F) ((A B C D E F) F) $ (CAR FOO) $ (CAR FOO) (A B C D E F ) (A B C D E F)
Реализация функции имеет вид:
(DEFUN LCONC (PAIR LST) ( (ATOM LST) PAIR ) ( (ATOM PAIR) (CONS LST (LAST LST)) ) ( (ATOM (CDR PAIR)) (RPLACA PAIR LST) (RPLACD PAIR (LAST LST)) ) ( RPLACD (CDR PAIR) LST ) ( RPLACD PAIR (LAST LST) ) )
На следующем шаге мы рассмотрим циклические (кольцевые) списки.