Шаг 70.
Реализация инкапсулированных типов данных. Строки в muLISP85

    На этом шаге мы рассмотрим функции работы со строками в muLISP85.

    В версии muLISP85 имеется еще около полутора десятков функций для работы со строками, например: PACK*, CHAR, STRING=, STRING<, STRING>, STRING<=, STRING>=, STRING/=, STRING-UPCASE, STRING-DOWNCASE, PRINT-LENGTH.

    Приведем перечень функций, которые рассматриваются на этом шаге:

Таблица 1. Функции работы со строками в muLISP85
Функция Назначение
(UNPACK ATOM)
Возвращает список символов, где P-имена каждого символа состоят из символов в печатном представлении ATOM.
(PACK LIST)
Возвращает символ, у которого P-имя состоит из сцепленных P-имен атомов в LIST.
(PACK* ATOM1 ... ATOMN)
Возвращает символ, у которого P-имя состоит из сцепленных P-имен ATOM1, ..., ATOMN.
(CHAR ATOM N)
Возвращает литеральный атом, у которого P-имя есть N-й символ P-имени ATOM.
(STRING ATOM1 ATOM2)
Возвращает Т, если P-имя ATOM1 лексикографически равно P-имени ATOM2, иначе - NIL.
(STRING< ATOM1 ATOM2)
Возвращает номер позиции первого символа, начиная с которого P-имена не совпадают.
(STRING-UPCASE ATOM)
Возвращает атом, у которого P-имя такое же, как и P-имя ATOM, за исключением того, что все строчные символы преобразуются в прописные.
(STRING-DOWNCASE ATOM)
Возвращает атом, P-имя которого такое же, как и P-имя ATOM, за исключением того, что все прописные буквы преобразуются в строчные.
(PRINT-LENGTH ATOM)
Возвращает число символов, требуемых для печати ATOM, на основании текущего значения системных переменных *PRINT-ESCAPE* и *PRINT-BASE*.
(FINDSTRING ATOM1 ATOM2 N)
Возвращает номер позиции первого вхождения P-имени ATOM1 в P-имя ATOM2, причем отсчет ведется с 0.
(SUBSTRING ATOM N M)
Возвращает атом, у которого P-имя состоит из символов P-имени ATOM, начиная с N-го по M-й, причем отсчет символов ведется с 0.

    Опишем их назначение.

    1. Функция (UNPACK ATOM) возвращает список символов, где P-имена каждого символа состоят из символов в печатном представлении ATOM. Если ATOM не является атомом, функция UNPACK возвращает NIL. Например:

   $ (UNPACK 'ABCDE)
   (A B C D E)
   $ (SETQ FOO -216)
   -216
   $ (UNPACK FOO)
   (- \2 \1 \6)

    Строковые функции, вызываемые с числовыми аргументами, автоматически создают строку символов - эквивалент числового значения на основе текущей системы счисления. Важно отметить, что P-имя числа изменяется с изменением текущей системы счисления. Например:

   $ (SETQ *PRINT-BASE* 16)
   10
   $ (UNPACK FOO)
   (- \0 D \8)
   $ (SETQ *PRINT-BASE* 10)
   10

    В начало таблицы

    2. Функция (PACK LIST) возвращает символ, у которого P-имя состоит из сцепленных P-имен атомов в LIST. Для определения P-имен чисел используется текущая система счисления. Отметим, что функция PACK всегда возвращает символ, даже если З-имя состоит только из однозначных чисел. Например:

   $ (PACK '(A B C))
   ABC
   $ (PACK '(3 A 5))
   |3A5|

    В начало таблицы

    3. Функция (PACK* ATOM1 ... ATOMN) возвращает символ, у которого P-имя состоит из сцепленных P-имен ATOM1, ..., ATOMN. Функция PACK* является более узкой версией функции PACK, т.к. она работает не со списком атомов, а с произвольным количеством атомов. Например:

   $ (PACK* 'A 'B 'C)
   ABC
   $ (PACK* 3 'A 5)
   |3A5|

    Код функции достаточно прост:

   (DEFUN PACK* LST
      (PACK LST)
   )

    В начало таблицы

    4. Если ATOM - либо литеральный, либо числовой атом, а N - неотрицательное целое число, то функция (CHAR ATOM N) возвращает литеральный атом, у которого P-имя есть N-й символ P-имени ATOM, причем отсчет ведется с 0. Функция CHAR возвращает NIL, если N - ни нуль, ни положительное целое число, или если P-имя атома ATOM содержит менее N символов. Например:

   $ (CHAR 'ABCDEFG 3)
   D
   $ (CHAR 5432 0)
   \5

    Код этой функции прост:

   (DEFUN CHAR (ATM N)
      ( (ATOM ATM) (NTH N (UNPACK ATM)) )
   )

    В начало таблицы

    5. Если P-имя ATOM1 лексикографически равно P-имени ATOM2, то функция (STRING ATOM1 ATOM2) возвращает Т, иначе - NIL.

    Если флаг FLAG не равен NIL, функция (STRING ATOM1 ATOM2 FLAG) выполняет аналогичное сравнение, но без различения заглавных и строчных букв. Например:

   $ (STRING= 'FAST 'FASTER)    $ (STRING= 'Fast 'FAST T)
   NIL                          T
   $ (STRING= 100 |100|)
   T

    В начало таблицы

    6. Если P-имя ATOM1 лексикографически меньше, чем P-имя ATOM2, то функция (STRING< ATOM1 ATOM2) возвращает номер позиции первого символа, начиная с которого P-имена не совпадают; в противном случае она возвращает NIL.

    Если FLAG не равен NIL, функция (STRING< ATOM1 ATOM2 FLAG) выполняет аналогичное сравнение, но без различия заглавных и прописных букв. Функции

    (STRING>  ATOM1 ATOM2 FLAG)
    (STRING<= ATOM1 ATOM2 FLAG)
    (STRING>= ATOM1 ATOM2 FLAG)
    (STRING/= ATOM1 ATOM2 FLAG)

также выполняют лексикографическое сравнение и возвращают или NIL, или номер позиции первого несовпадающего символа в P-именах. Функция STRING> сравнивает P-имена на >, STRING<= - на <=, STRING>= - на >=, а STRING/= - на <>. Например:

   $ (STRING< 'DOG 'CAT)      $ (STRING<= 'DOG 'DOG)
   NIL                        3
   $ (STRING< 'CAT 'DOG)      $ (STRING/= 'DOG 'DOG)
   0                          NIL
   $ (STRING< 'DOG 'DOGGY)
   3

    В начало таблицы

    7. Функция (STRING-UPCASE ATOM) возвращает атом, у которого P-имя такое же, как и P-имя ATOM, за исключением того, что все строчные символы преобразуются в прописные. Если ATOM не является атомом, то функция STRING-UPCASE возвращает NIL. Например:

   $ (STRING-UPCASE "Lisp is recursive")
   |LISP IS RECURSIVE|

    В начало таблицы

    8. Функция (STRING-DOWNCASE ATOM) возвращает атом, P-имя которого такое же, как и P-имя ATOM, за исключением того, что все прописные буквы преобразуются в строчные. Если ATOM не является атомом, то функция STRING-UPCASE возвращает NIL. Например:

   $ (STRING-DOWNCASE "Lisp is recursive")
   |lisp is recursive|

    Приведем реализацию этой функции:

   (DEFUN STRING-DOWNCASE (ATM)
      ( (ATOM ATM)
           (PACK (MAPCAR '(LAMBDA (CHAR)
                               ( (< 64 (ASCII CHAR) 91)
                                 (ASCII (+ (ASCII CHAR) 32)))
                               CHAR)
                          (UNPACK ATM))) )
   )

    В начало таблицы

    9. Если ATOM есть атом, то функция (PRINT-LENGTH ATOM) возвращает число символов, требуемых для печати ATOM, на основании текущего значения системных переменных *PRINT-ESCAPE* и *PRINT-BASE*. В противном случае функция PRINT-LENGTH возвращает NIL. Например:

   $ (PRINT-LENGTH 'MULISP)   $ (PRINT-LENGTH NIL)
   6                          3
   $ (PRINT-LENGTH -13)
   3

    Приведем реализацию этой функции:

   (DEFUN PRINT-LENGTH (ATM)
      ( (ATOM ATM) (LENGTH (UNPACK ATM)) )
   )

    В начало таблицы

    10. Функция (FINDSTRING ATOM1 ATOM2 N) возвращает номер позиции первого вхождения P-имени ATOM1 в P-имя ATOM2, причем отсчет ведется с 0. Если N - нуль или положительное целое число, то поиск начинается с N-го символа ATOM2. Если P-имя ATOM1 не найдено, функция возвращает NIL. Например:

   $ (FINDSTRING 'XYZ 'ABCXYZDEFXYZGHI)
   3
   $ (FINDSTRING 'XYZ 'ABCXYZDEFXYZGHI 4)
   9
   $ (FINDSTRING 'XYZ 'ABCDEFGHI)
   NIL

    В начало таблицы

    11. Если ATOM - либо атом, либо числовой атом, N и M - неотрицательные целые, и N<=M, то функция (SUBSTRING ATOM N M) возвращает атом, у которого P-имя состоит из символов P-имени ATOM, начиная с N-го по M-й, причем отсчет символов ведется с 0.

    Все значения N меньшие 0, принимаются равными 0.

    Если M пропущено, является отрицательным целым числом или больше, чем количество символов в P-имени ATOM, принимается, что M равно количеству символов в P-имени.

    Если N больше или равно количеству символов в P-имени или если N>M, функция SUBSTRING возвращает атом, у которого P-имя есть нулевая строка.

    Отметим, что SUBSTRING всегда возвращает атом, даже если ATOM есть число. Например:

   $ (SUBSTRING 'ABCDEFG 2 4)    $ (SUBSTRING 'ABCDEFG 0 4)
   CDE                           ABCDE
   $ (SUBSTRING 'ABCDEFG 2)      $ (SUBSTRING 1000 0)
   CDEFG                         |1000|

    Приведем код функции:

   (DEFUN SUBSTRING (ATM N M)
      ( (AND (ATOM ATM) (INTEGERP N))
          ( (MINUSP N)
               (SUBSTRING ATM 0 M) )
          (PACK (SUBLIST (UNPACK ATM) N M)) )
   )

    В начало таблицы


    Замечание. Развитие теории структур данных, методов и языков программирования обработки списков вызвано в основном требованиями к частной области применения ЭВМ, а именно - к обработке символов. Эта область включает такие проблемы, как искусственный интеллект, алгебраические преобразования, обработка текста и теория графов. Отметим, что все эти проблемы имеют следующие общие свойства [1, с.444]:



(1)Трамбле Ж., Соренсон П. Введение в структуры данных. - М.: Машиностроение, 1982. - 784 с.


    Со следующего шага мы начнем рассматривать создание и работу с очередями.




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