Шаг 72.
Функции для построения очереди

    На этом шаге мы рассмотрим функции для построения очереди.

    В версиях 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) )
   )

    На следующем шаге мы рассмотрим циклические (кольцевые) списки.




Предыдущий шаг Содержание Следующий шаг