
- •1. Основные принципы работы в системе muLisp
- •3. Сообщения о прерывании работы интерпретатора
- •4. Сообщения об ошибках
- •5. Редактирование текстов программ и загрузка исходных
- •Insert - переключение режимов редактирования
- •6. Организация ввода-вывода
- •7. Отладка программ
- •8.4 Функции сравнения
- •8.5 Логические функции
- •8.6 Функции присваивания
- •8.7 Примитивы определения функций
- •8.8 Арифметические функции
- •8.9 Функционалы
- •8.10 Функции ввода
- •8.12 Функции работы со строками 2.
- •8.13 Работа со стеком 2.
- •8.14 Функции свойств
- •8.15 Контрольные конструкции
7. Отладка программ
Для отладки программ в системе muLISP можно рекомендовать
включение в текст программы операторов отладочной печати для выво-
да информации о текущих значениях анализируемых переменных (поль-
зуясь тем, что функции PRIN1 и PRINT выдают в качестве своего зна-
чения значение выводимого аргумента), а так же организацию
прерываний выполнения программы с помощью функции BREAK.
При обращении к функции (BREAK P1 P2) осуществляется прерыва-
ние работы системы с выводом сообщения вида:
<P2> Break: <P1>
Continue,Abort,Top-level,Restart,System?
Здесь выражениями <P1> и <P2> обозначены значения переменных
P1 и P2 соответственно. Выбор режима С вызовет продолжение прог-
раммы, а режима В - прерывание выполнения программы и перехода в
ЛИСП-систему на следующий уровень, где можно посмотреть обычным
- 16 -
образом значения любых переменных. Для продолжения работы програм-
мы необходимо ввести команду (RETURN) или нажать клавишу Esc.
Рассмотрим использование этих средств на примере отладки ре-
курсивной функции построения ассоциативного списка:
$ (DEFUN ASS (L1 L2)
(PRIN1 "***1")(PRIN1 L1)(PRINT L2) ; вывод значений
; входных параметров
(COND
( (NULL L1) NIL )
( T (BREAK 1 1) ; организация прерывания
(CONS (PRINT (CONS (CAR L1)(CAR L2) ) ) ; печать
;значений промежуточных аргументов функции CONS
(ASS (CDR L1) (CDR L2) )
)
)
)
)
ASS ; результат выполнения функции DEFUN
$ (ASS '(1 2) '(A B) ) ; вызов функции ASS
|***1|(1 2)(A B) ; вывод значений входных параметров
; при первом обращении к ASS
1 Break: 1 ; вывод сообщения о прерывании 1
Continue,Abort,Top-level,Restart,System? B ;выбор режима BREAK
1$ L1 ; определение значения переменной L1
( 1 2) ; вывод значения переменной L1
1$ ; ввод команды Esc для продолжения выполнения программы
(1.A) ; вывод аргумента функции CONS
|***1|(2)(B) ; вывод значений входных параметров
; при втором(рекурсивном) обращении к ASS
1 Break: 1 ; прерывание
Continue,Abort,Top-level,Restart,System? C ;выбор режима Continue
(2.B) ; вывод аргумента CONS
|***1|NIL NIL ; вывод значений входных параметров
; при третьем обращении к ASS
((1.A)(2.B)) ; вывод результата функции ASS
- 17 -
8. ОПИСАНИЕ НАИБОЛЕЕ ИСПОЛЬЗУЕМЫХ ФУНКЦИЙ ЯЗЫКА
8.1. Функции выборки
(CAR S)
1.S-список.CAR выдает первый элемент списка
(CAR '(A B C D)) --> A
2.S-точечная пара.CAR выдает левую часть часть точечной
пары
(CAR '((A . B) . C) --> (A . B)
3.S-атом.CAR выдает значение атома, присвоенное ему спе-
циальными функциями присваивания
(SETQ X 7) --> 7
(CAR 'X) --> 7
(В случае если у атома значение отсутствует, выдается имя
атома)
(CDR S)
1.S-список.CAR возвращает список без первого элемента
(CDR '(A B C D)) --> (B C D)
2.S-точечная-пара.CDR возвращает правую часть точечной
пары (на верхнем уровне)
(CDR '((A . B) . C)) --> С
3.S-атом.CDR возвращает список свойств атома
(PUT 'JOE 'SEX 'MALE) --> MALE
(CDR 'JOE) --> ((SEX . MALE))
Допускается сокращенная запись последовательной композиции
функций CAR и CDR на глубину не более пяти.
(CAADAR list) <-> (CAR (CAR (CDR (CAR list))))
(LAST L)
LAST - возвращает список, в котором убраны все элементы
кроме последнего
(LAST '(A B C D)) --> (D)
(LAST '(A B C . D)) --> (C . D)
- 18 -
(LAST 'A) -- > NIL
(NTHCDR N L)
NTHCDR - возвращает N-й CDR от списка L
(NTHCDR 0 '(A B C D)) --> (A B C D)
(NTHCDR 1 '(A B C D)) --> (B C D)
(NTHCDR 2 '(A B C D)) --> (C D)
(NTHCDR 5 '(A B C D)) --> NIL
(NTHCDR 2 '(A B . C)) --> C
(NTH N L)
NTH - возвращает N-й элемент списка (отсчет ведется с
нуля)
(NTH 0 '(A B C D)) --> А
(NTH 3 '(A B C D)) --> D
(NTH 4 '(A B C D)) --> NIL
(SUBLIST L N M)
SUBLIST - копирует и возвращает подсписок с N-го по M-й
элементы (отсчет ведется от нуля)
(SUBLIST '(A B C D E) 2 4) --> (C D E)
(SUBLIST '(A B C D E) 2 2) --> (C)
(SUBLIST '(A B C D E) 2) --> (C D E F)
(SUBLIST '(A B C D E) 0 3) --> (A B C D)
(ASSOC K AL)
ASSOC - осуществляет поиск в ассоциативном списке AL по
значениям ключа К соответствующего свойства
(SETQ CAPITALS '((USA . WASHINGTON)
(FRANCE . PARIS)
(JAPEN . TOCIO) )
) --> ((USA . WASHINGTON) (FRANCE . PARIS) (JAPEN . TOCIO)))
(ASSOC 'FRANCE CAPITALS) --> (FRANCE . PARIS)
(ASSOC 'AUSTRALIA CAPITALS) --> NIL
8.2 Конструирующие функции
- 19 -
(CONS S1 S2)
1.S2-список.CONS возвращает список S2 первым элементом
которого добавлен аргумент S1
(CONS 'A '(B C D)) --> (A B C D)
2.S2-атом.CONS возвращает точечную пару,левая часть кото-
рой S1, а правая - S2
(CONS 'A 'B) --> (A . B)
(LIST S1..Sn)
LIST - конструирует и возвращает список, из элементов
S1, S2,...Sn.При отсутствии аргументов возвращает NIL
(LIST 'A 'B 'C 'D) --> (A B C D)
(LIST 'A '(B C) 'D) --> (A (B C) D)
(LIST) --> NIL
(APPEND L1..Ln)
APPEND - конструирует и возвращает список из элементов
списков L1, L2 ,... Ln
(APPEND '(A B C) '(D E F)) --> (A B C D E F)
(SETQ FOO '(1 2 3)) --> (1 2 3)
(APPEND '(A B C) FOO '(K L M)) --> (A B C 1 2 3 K L M)
(REVERSE L)
REVERSE - возвращает реверсированный список L (элементы
списка L в обратном порядке)
(REVERSE '(A B C D E)) --> (E D C B A)
(REVERSE '(A B C) '(1 2 3)) --> (C B A 1 2 3)
(REVERSE '(A B C) 'D) --> (A B C . D)
(LENGTH S)
1.S-список.LENGTH возвращает число элементов в списке L
(LENGTH '(A B C D E)) --> 5
2.S-атом.LENGTH возвращает число символов в атоме
(LENGTH 'TIME) --> 4
3.S-число.LENGTH возвращает количество байтов занимаемых
числом в памяти
(LENGTH -13) --> 1
- 20 -
8.3 Функции распознавания
(NUMBERP S)
Результат Т, если S - целое число, иначе NIL
(NUMBERP 32) --> T
(NUMBERP 'D) --> NIL
(ATOM S)
Результат Т, если S - атом, иначе NIL
(ATOM 'KOT) --> T
(ATOM '(A B C)) --> NIL
(ATOM NIL) --> T
(LISTP S)
Результат Т, если S - список, иначе NIL
(LISTP 'DOG) --> NIL
(LISTP '(A B C)) --> NIL
(LISTP NIL) --> T
(NULL S)
Результат Т, если S - пустой список, иначе NIL
(NULL NIL) --> T
(NULL () ) --> T
(NULL '(A B C)) --> NIL
(ZEROP S)
Результат Т, если S - нуль, иначе NIL
(ZEROP 0) --> T
(ZEROP 12) --> NIL
(ZEROP 'DOG) --> NIL
(PLUSP S)
Результат T, если S - положительное число
(PLUSP 12) --> T
(PLUSP -4) --> NIL
(PLUSP 0) --> NIL
- 21 -
(PLUSP 'DOG) --> NIL
(MINUSP S)
Результат Т, если S - отрицательное число
(MINUSP 12) --> NIL
(MINUSP -4) --> T
(MINUSP 0) --> NIL
(MINUSP 'DOG) --> NIL
(ODDP S)
Результат Т, если S - нечетное число, иначе NIL
(ODDP 12) --> NIL
(ODDP -41) --> T
(ODDP 0) --> NIL
(EVENP S)
Результат Т, если S - четное число, иначе NIL
(EVENP 12) --> T
(EVENP -41) --> NIL
(EVENP 0) --> T