Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по языку ЛИСП.doc
Скачиваний:
105
Добавлен:
28.06.2014
Размер:
210.94 Кб
Скачать

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