- •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 Контрольные конструкции
МИНИСТЕРСТВО НАУКИ, ВЫСШЕЙ ШКОЛЫ И ТЕХНИЧЕСКОЙ
ПОЛИТИКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
─────────────
МОСКОВСКИЙ ЭНЕРГЕТИЧЕСКИЙ ИНСТИТУТ
───────────────────────────────────────────────────────
ЛАБОРАТОРНЫЙ ПРАКТИКУМ
по курсу
Программирование и алгоритмические языки
ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ЛИСП В СИСТЕМЕ muLISP-90
───────────────────────────────────────────────────────
Москва 1993
МИНИСТЕРСТВО НАУКИ, ВЫСШЕЙ ШКОЛЫ И ТЕХНИЧЕСКОЙ
ПОЛИТИКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
─────────────
МОСКОВСКИЙ ЭНЕРГЕТИЧЕСКИЙ ИНСТИТУТ
───────────────────────────────────────────────────────
Утверждено
учебным управлением МЭИ
ЛАБОРАТОРНЫЙ ПРАКТИКУМ
по курсу
Программирование и алгоритмические языки
ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ЛИСП В СИСТЕМЕ muLISP-90
───────────────────────────────────────────────────────
Москва 1993
.
_Программирование на языке ЛИСП в системе muLISP-90 .. Бай-
дун В.В., Кружилов С.И., Сергиевский А.Е, Чернов П.Л. - М.:
Моск. энеpг. ин-т, 1993. ─ 40 с.
Лабораторный практикум содержит описание основных принци-
пов программирования и работы в системе muLISP-90., а так же
список базовых функций, используемых в этой системе. Приведены
рекомендации по отладке программ.
Лабораторный практикум предназначен для слушателей ФПКП и
студентов специальности "Прикладная математика", выполняющих
практические задания и типовой расчет на языке ЛИСП с примене-
нием персональных ЭВМ.
─────────────────────
С Московский энергетический институт, 1993 г.
- 3 -
ВВЕДЕНИЕ
Использование языка ЛИСП для исследования и разработки прог-
раммного обеспечения в области решения задач искусственного интел-
лекта определяется комплексом его отличительных черт:
- Теоретическая стройность и строгость языка, простая семан-
тика обеспечивают ясность понимания принципов его работы;
- Аппликативность ЛИСПа обеспечивает естественность функцио-
нального подхода при разработке в его среде сложных программных
систем с использованием методик как "сверху-вниз",так и "сни-
зу-вверх";
- Рекурсивность языка позволяет в ряде случаев существенно
упростить реализацию алгоритмов решения задач;
- Универсальность структурирования данных в ЛИСПе, возмож-
ность строить структуры данных в динамике, наряду с автоматическим
распределением памяти, делает его незаменимым инструментом решения
задач со сложной структурой данных;
- Расширяемость языка позволяет пользователю добавлять собс-
твенные функции и структуры данных;
- Интерактивность реализации ЛИСП-систем, удобство и быстрота
отладки программ делают ЛИСП мощным инструментом для программиро-
вания и программного моделирования большого класса задач.
В данном пособии приводятся основные сведения для работы в
системе muLISP, одной из наиболее известных ЛИСП-систем для персо-
нальных ЭВМ. К основным достоинствам этой системы можно отнести
структурность реализованной версии языка, большой набор базовых
функций, компактность реализации системы наряду с высокой эффек-
тивностью интерпретации программ. Приведенные далее сведения соот-
ветствуют версии системы muLISP-90.
1. Основные принципы работы в системе muLisp
Если система muLISP установлена на вашей ПЭВМ, то для ее вы-
зова в среде операционной системы MS-DOS нужно ввести команду
MULISP. Вслед за эти на экране появляется сообщение идентифицирую-
щее версию системы muLISP. Знак "$" в начале следующей строки и
- 4 -
мигающий курсор за ним показывают, что система готова к вводу и
интерпретации команд.
В качестве команды можно ввести либо имя атома, либо точечное
выражение, либо список со сбалансированным набором скобок. Завер-
шение ввода определяется нажатием клавиши Enter. muLISP считывает
введенное выражение, вычисляет его и печатает на экране полученный
результат. После чего в новой строке опять появляется символ "$" -
приглашение к вводу новой команды. Обратим внимание, что если
скобки в команде не сбалансированы, то система либо выдаст сообще-
ние об ошибке (закрывающих скобок больше открывающих), либо будет
ждать ввода нужного числа закрывающих скобок, если их не хватает,
даже после нажатия клавиши Enter. Так продолжается до тех пор, по-
ка не будет введена команда (SYSTEM) после выполнения которой уп-
равление возвращается операционной системе.
Команда вычисляется следующим образом. Если введен список
первым элементом которого является имя функции, как стандартной,
так и определенной программистом с помощью оператора DEFUN, то ос-
тальные элементы списка будут считаться фактическими параметрами
этой функции. После чего функция вычисляется для заданных значений
параметров. Во всех остальных случаях (атом,точечная пара, список-
данное) вычисляется значение введенного выражения.
Ниже приведен пример сеанса работы в системе muLISP:
>MULISP ; вызов системы muLISP из MS-DOS
muLISP IBM/PC MS-DOS version 7.20 (10/15/92)
Copyright 1983,1987,1990 Soft Warenhouse, Inc.
$(DEFUN PROC (X Y) (* (/ Y 100) X) ;определение функции X% от Y
PROC ;вывод значения функции DEFUN
$(PROC 5 100) ;обращение к функции PROC
20 ;вывод значения функции PROC
$(SETQ A 7) ;выполнение функции А:=7
7 ;вывод значения функции А:=7
$A ;команда-атом
7 ;вывод значения атома
$(A B C) ;команда-список данных
(A B C) ;вывод значения списка
- 5 -
$(CDR '(A B C) ) ;иллюстрация записи
(B C) ;оператора QUOTE
$(CAR A) ) ;ввод ошибочной команды
;(лишняя закрывающая скобка)
Syntax error: ;сообщение об ошибке
Continue,Break,Abort,Top-level,Restart,System? Т
$(SYSTEM) ;команда выхода из ЛИСПА в MS-DOS
>
Из приведенного примера понятен способ комментирования прог-
рамм в системе muLISP: комментарием считается текст следующий
после символа ";" до конца строки.
В обычных условиях при вводе команд строчные буквы автомати-
чески преобразуются в заглавные. Для того, чтобы избежать такого
преобразования нужно присвоить специальной управляющей переменной
*READ-UPCASE* значение NIL. Это можно сделать например командой
(SETQ *READ-UPCASE* NIL). Любое другое значение присвоенное этой
переменной опять повлечет за собой преобразование символов.
В процессе ввода команды обеспечивается стандартная для систе-
мы MS-DOS возможность редактирования текста вводимых команд. Крат-
кий список комбинаций клавиш управления редакторскими функциями
приведен ниже:
-> - сдвиг курсора на 1 символ вправо;
<- - сдвиг курсора на 1 символ влево;
Ctrl + -> - сдвиг курсора вправо на слово;
Ctrl + <- - сдвиг курсора влево на слово;
End - сдвиг курсора в конец строки;
Home - сдвиг курсора в начало строки;
Del - удалить символ в позиции курсора;
Baskspace - удалить символ слева от курсора;
Ctrl + T - удалить слово под курсором;
Ctrl + Y - удалить текущую строку;
Ctrl + Q + Y - удалить часть строки справа от курсора;
Ctrl + Q + H - удалить часть строки слева от курсора;
F3 - вставить удаленную или предыдущую команду;
Ins - переключение редактора из режима вставки в
- 6 -
режим замещения и обратно;
Enter - выход из редактора и ввод текста;
Esc - выход из редактора без ввода текста.
Символом + здесь обозначается сочетание клавиш используемых
для редактирования.
Этих средств достаточно для ввода отдельных команд. Набор
текстов программ и структур данных лучше осуществлять с помощью
более мощного редактора ( см. раздел "Редактирование текста прог-
раммы" ).
2. ОСОБЕННОСТИ ПРОГРАММИРОВАНИЯ В СИСТЕМЕ muLISP
Особенности программирования в системе muLISP определяются на-
бором средств расширения стандартного языка ЛИСП:
- Для записи оператора QUOTE допускается следующее сокращение:
(QUOTE S) может записываться как 'S (см. в приведенном выше приме-
ре);
- Автоквотирование атомов. При создании нового символьного
атома, система устанавливает значение этого атома равным его име-
ни. Так атом SLON, появившийся в системе, будет иметь значение
SLON до тех пор пока не произойдет присваивания нового значения.
Это позволяет в ряде случаев не пользоваться оператором QUOTE.
Например, можно вместо выражения (SETQ X 'SLON) писать просто
(SETQ X SLON);
- При построении тела функций подразумевается неявное исполь-
зование оператора PROGN, т.е. тело функции может представлять со-
бой последовательность операторов:
(DEFUN F (X Y) (S1 ...)(S2 ...)...(Sn ...) ).
Результирующим значением функции F будет значение последнего
из них Sn. В соответствии с этим принципом расширено использование
многих функций ЛИСПа, и ,в частности, оператора COND, где вместо
одного действия, выполняемого после определения истинного условия,
допускается последовательность действий, выполняемых по принципу
неявного оператора PROGN:
(COND (P1 S11 S12...)...(Pn (SN1 SN2...) ).
- 7 -
- Для упрощения структуры программы в систему введен неявный
оператор COND, имеющий вид ( (P...) S1 S2 ... SN ). Этот оператор
является аналогом оператора IF P THEN (S1...SN).
- В системе отсутствует оператор GO.
- Для записи итерационных алгоритмов введен структурный опера-
тор цикла LOOP, имеющий вид (LOOP S1 S2 ... SN) и позволяющий бес-
конечно повторять последовательность операторов (S1 S2 ... SN).
Выход из цикла может быть осуществлен с помощью одного или нес-
кольких неявных операторов COND. Например итерационное определение
функции ФАКТОРИАЛ с использованием оператора цикла может иметь
следующий вид:
(DEFUN FACTORIAL (N M)
(SETQ M 1) ;М:=1
(LOOP ;оператор цикла
( (ZEROP N) M) ;неявный COND для выхода из цикла
(SETQ M (* M N)) ;M:=M*N
(SETQ N (SUB1 N)) ;N:=N-1
)
).
- В muLISPе избыточные аргументы в списке формальных парамет-
ров функции могут быть использованы в качестве локальных перемен-
ных внутри функции. При входе в функцию всем избыточным аргументам
присваивается значение NIL. Примером может служить переменная М в
приведенном выше определении факториала. Это позволяет, наряду с
неявным использованием аппарата PROGN, отказаться от использования
в программах операторов PROG, что упрощает структуру программы.
- muLISP обеспечивает применимость операторов CAR и CDR к ар-
гументам любых типов, а не только к спискам. Так (CAR A) выдает
значение атома А, а (CDR A) - список его свойств. Аналогичные сог-
лашения имеются и для числовых атомов. Потому при работе необходи-
мо соблюдать определенную осторожность.
- В языке расширена трактовка многих операторов ЛИСПа таких
как +, -, *, SETQ и т.д. Они определены не только для двух аргу-
ментов, а допускают гораздо большее их количество. Поэтому, глядя
на описания функций приведенных в следующих разделах, обращайте,
пожалуйста, на это внимание! К тому же, интерактивность при работе
- 8 -
с системой дает возможность посмотреть, как выполняется любая ко-
манда. Пользуйтесь этой возможностью, чтобы проверить правильность
понимания вами принципов работы функций системы!