YLISP 3.7 WIN32
Y L i s p 3.7
= Система разработки Коммон Лисп - программ для WIN32 =
| Московский авиационный институт, факультет "Прикладная математика", |
| Дмитрий Анатольевич Иванов http://www.aha.ru/~divanov/ |
| |
| Портирование в WIN32, развитие системы - Арсений Слободюк |
| Институт химии ДВО РАН ampy@users.sourceforge.net |
Система YLisp 3.7 есть реализация подмножества популярнейшего диалекта
языка Лисп - Коммон Лиспа (Common LISP), включая его объектно-ориенти-
рованное расширение Common LISP Object System (CLOS). Входной язык ин-
терпретатора строго следует документам:
[CLTL]. G.L.Steele. Common LISP: The Language. Digital Press, 1984.
[CLOS]. Bobrow D.G., DeMichiel L.G., Gabriel R.P., Keene S.E., Kiczales
G., Moon D.A. Common LISP Object System specification. /X3J13
Document 88-002R.
В настоящее время постепенно производится дополнение реализации возмож-
ностями из второго издания [CLTL] и стандарта Common Lisp.
Интерпретатор YLisp
- является компактной программой, экономно использующей оперативную
и дисковую память и оптимизированную по скорости выполнения.
Доступный максимальный объем памяти - по 16Мб для массивов, структур,
строк и для списковых ячеек;
- полностью русифицирован: гарантируется адекватное преобразование
строчных букв в заглавные и наоборот. Сообщения об ошибках и докумен-
тация по многим функциям, типам и макросам выводятся на русском
языке.
- имеет оконный текстовой интерфейс с преопределенными и определяемыми
пользователем управляющими клавишами, возможностью создания
аналогичного интерфейса в Лисп - программах, мощный отладчик, систему
контекстно-зависимой помощи.
Freeware - условия применения
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Программа интерпретатора YLisp 3.7 является общедоступной, т.е. ее
можно свободно копировать и распространять в любом количестве
экземпляров при условии некоммерческого использования.
Установка системы YLisp 3.7
~~~~~~~~~~~~~~~~~~~~~~~~~~~
Установка YLisp-интерпретатора заключается в копировании файлов дистри-
бутива на жесткий диск, например в директорий \YLISP.
Russian vs. English
~~~~~~~~~~~~~~~~~~~
Вы можете варьировать языковую версию двух типов текстов:
(i) подсказки, предупреждения и диагностические сообщения о наи-
более серьезных ошибках,
(ii) основная масса сообщения об ошибках и документация по встро-
енным примитивам языка Коммон Лисп.
Русифицированную версию текстов типа (i) обеспечивают файлы
YLISP.ROL и RUSSIAN.ROL.
Русифицированную версию текстов типа (ii) - RUSSIAN.HLL и
RUSSIAN.IND. Вдобавок необходимо, чтобы системная возможность
RUSSIAN была включена в список *features*.
Файл RUSSIAN.HLL обязательно должен присутствовать в каталоге
\YLISP вместе с RUSSIAN.IND; аналогично, ENGLISH.HLL требует нали-
чия ENGLISH.IND.
Англоязычная версия документации не является полной и местами не-
точна.
Временные файлы
~~~~~~~~~~~~~~~
Система YLisp создает два типа временных файлов: бинарные файлы
свертки при вызове подпроцесса (функция spawn) и ASCII-файлы, ис-
пользуемые редактором. По умолчанию и те, и другие помещаются на
текущем дисководе в текущий каталог пользователя. Задание перемен-
ной окружения операционной системы YLTMP позволяет переопределить
директорий, где YLisp создает такие файлы. Например, установка
set YLTMP=I:\
указывает, что временные файлы будут размещаться в корневом ката-
логе диска I.
Запуск программы интерпретатора
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Формат команды запуска программы интерпретатора следующий:
[drive:][dir\]name.EXE [-ROL pathname] [#+feature|#-feature|argument]*
Здесь
drive,dir Указывают место расположения системного каталога интерпрета-
тора YLisp.
name.EXE имя исполняемого файла интерпретатора, в исходной поставке -
YLISP.EXE. Может быть изменено для создания приложений. В
этом случае, умолчанием для файла свертки будет являться
новое имя исполняемого файла с расширением ROL (см. также
возможность STARTUP).
pathname Спецификация (возможно, полная) файла свертки, из которого
восстанавливается образ Лисп-среды. Если pathname не указан,
то для загрузки используется файл name.ROL из системного
каталога YLisp.
#+feature Включает системную возможность, заданную символом feature, в
список *features*.
#-feature Выключает системную возможность, заданную символом feature,
удаляет его из списка *features*.
argument Параметр командной строки, помещаемый в список *arguments*.
Первым элементом этого списка всегда устанавливается
полное имя исполняемого файла лисп-системы.
К числу системных возможностей, управляющих работой системы YLisp 3.7,
относятся следующие.
Возможность Описание
----------- --------
RUSSIAN Включение данной возможности означает использование фай-
ла документации RUSSIAN.HLL (вместе с RUSSIAN.IND) в ка-
честве источника текстов сообщений и справочной информа-
ции, см.п. "Установка системы".
Если возможность выключена, то источником подобной ин-
формации служит ENGLISH.HLL (наряду с ENGLISH.IND).
STARTUP Включение данной возможности означает выполнение одного
из двух следующих действий, выполняемых сразу после
старта системы:
- если определена Лисп-функция startup, то она автомати-
чески вызывается без аргументов;
- если функция startup не определена, то в текущем ка-
талоге пользователя ищется файл STARTUP.LSP, который
загружается в систему при помощи load.
По умолчанию, возможность STARTUP включена.
Цикл чтение-оценивание-печать
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
После выполнения стартовых операций, YLisp функционирует в стиле, тра-
диционном для всех Лисп-систем, а именно, циклически повторяет следую-
щую последовательность шагов.
- ввод очередного выражения языка Коммон Лисп, называемого также формой
или S-выражением;
- интерпретация, или оценивание, введенной формы;
- печать каждого из значений формы с новой строки экрана (их будет
несколько в случае мультизначения).
Подробнее остановимся на способе ввода выражений. Когда система YLisp
ждет нажатия очередной клавиши, она переводит строку и выдает приглаше-
ние
>
Считывание с клавиатуры может происходить в одном из двух режимов.
Ассоциативный ввод
~~~~~~~~~~~~~~~~~~
В данном режиме обрабатывается одно первое нажатие клавиши. Если
соответствующий знак имеет связь в таблице клавиш *keymap* (или
другой, см. ADDONS.TXT), то выполняется действие, с ним ассоцииро-
ванное. Команды отладчика также вводятся в этом режиме.
Если же введенный литеру нельзя интерпретировать как команду, то
система переходит в режим линейного редактирования, куда и переда-
ется данная литера.
Линейное редактирование
~~~~~~~~~~~~~~~~~~~~~~~
Данный режим позволяет редактировать форму или ее часть, размещен-
ную в одной линии экрана. Через функциональные клавиши он предост-
авляет удобный набор команд, свойственных текстовому редактору.
Клавиша Выполняемое действие
------- --------------------
Ins Переключить режим вставки/замены
Left Курсор влево
Right Курсор вправо
Home Курсор к началу строки
End Курсор к концу строки
Tab Дополнение частично набранного символа
Shift-Tab Табуляция влево
Ctrl-Left Курсор на слово влево
Ctrl-Right Курсор на слово вправо
Del Удалить знак под курсором
Backspace Удалить знак слева от курсора
Ctrl-Backspace Удалить слово слева от курсора
Ctrl-Del Удалить слово справа от курсора
Ctrl-Y Очистить редактируемую линию
Ctrl-Ins Копировать выделенный текст в буфер обмена.
Shift-Ins Вставить текст из буфера обмена.
Shift-Del Вырезать текст и поместить в буфер обмена.
Shift-Left/Right/Home/End Выделение текста
Up/Down Вывести в редактируемую линию предыдущую/следующую
введенную строку. Буфер `команд' организован в виде
кольцевого стека и хранит до 30 ранее введенных
строк.
ESC Отказаться от редактируемой формы и перейти в режим
ассоциативного ввода.
Enter Ввод отредактированной линии в систему.
F1 Получить справку по функции, переменной и т.п.,
символ которой находится под курсором или непосре-
дственно слева от него.
Оценивание формы начинается лишь тогда, когда она полностью введена в
систему. Длинная списковая или структурная форма может не поместиться в
одной вводимой строке. В таком случае, набрав часть элементов, следует
нажать Enter, причем текущее местоположение курсора несущественно. Пос-
ле перевода строки система будет ждать продолжения набора формы, перей-
дя опять-таки в режим ассоциативного ввода. При этом, если скобки ( и )
в неполном выражении не сбалансированы, YLisp изменит свое приглашение
на
n>
где n есть целое число открытых левых скобок (, оставшихся незакрытыми.
Подсчет данного числа ведется
- либо начиная с внешнего уровня формы,
- либо от последней суперскобки {, подробнее см.файл ADDONS.TXT.
Конкретный вид приглашения системы зависит от текущего состояния рабочей
среды и задается значением динамической переменной *read-prompt*, кото-
рое может быть Лисп-строкой, символом или строковым знаком, причем
- число незакрытых скобок выдается только перед приглашением-знаком,
- значение nil отменяет выдачу приглашения вообще.
Условно цикл чтение-оценивание-печать изображен на следующей диаграмме
Неинтерпретируемая
********************** клавиша **********************
* Ассоциативный ввод ******************>* Линейное *
* (одна клавиша) * * редактирование *
* *<*****<************ (вся строка) *
********************** * Esc **********************
* Интерпре- * * V Enter
* тируемая * * нет **************************
* клавиша * *<******** Форма введена целиком? *
* V **************************
* ********************* * да
* * Оценивание *<************
* *********************
* *
* V
* **********************
*<*********** Печать результатов *
**********************
Завершить работу системы YLisp можно нажатием сочетания клавиш Alt-F4
или вызовом функции exit.
Получение дополнительной информации
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Документация по YLisp организована при помощи стандартной
системы документирования Common Lisp. Получить подсказку по
интересующей функции, макро, переменной можно:
- набрав интересующий символ в строке ввода и нажав F1
- При помощи функций (DOCUMENTATION symbol) или (HELP symbol)
(полное описание функции HELP см. в системе документации).
Стандартная система документирования является основным хранилищем ин-
формации о YLisp. См. также файл common.txt о системе документирования.
Технические особенности реализации
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
На разработку YLisp повлияло очное знакомство автора со следующими реа-
лизациями языка Лисп на IBM PC:
GCLisp 1.01,
XLisp 1.4,
PC-Lisp 2.11,
мuLisp-87,
и заочное с
GCLisp Developer 3.1,
IQLisp/IQClisp,
TransLisp Plus,
KCL/AKCL и рядом реализаций для ПК Macintosh.
YLisp является полностью оригинальной разработкой и никак не связан с
вариантом XLISP для Hewlett-Packard HP-95LX.
Интерпретатор YLisp написан на Microsoft Visual C 6.0.
Размер исходного текста: около 30000 строк на Си и 3000 на Лиспе. Число
объектных модулей 55.
Память интерпретатора организуется по принципу BIBOP (BIg Bag Of
Pages). Длинные указатели на Лисп-объекты содержат теги, под которые
отводится от 8 до 16 бит, в зависимости от типа. Один бит зарезервиро-
ван для сборщика мусора. Все оперативное пространство разбивается на
следующие разделы:
- Списковые ячейки (cons cells) размером 8 байт.
- Ячейки символов размером 18 байт.
- Куча, где хранятся вектора, включая строки и печатные имена символов,
числа, а также объекты `вмещающих' типов данных: структуры, стан-
дартные объекты и т.п. Каждый объект кучи имеет 6х-байтный дескрип-
тор.
- Хэш-таблица символов.
- Защитный стек, куда вносятся адреса Си-переменных, содержащих указа-
тели на Лисп-объекты, с целью предотвратить `выметание' их сборщиком
мусора.
- Стек связей, служащий для двух целей:
1) сохранение адресов фреймов, устанавливающих точки возможных не-
локальных переходов;
2) хранение значений Лисп-переменных.
Фактически, выделение памяти происходит в порядке, обратном вышеуказан-
ному, причем область списковых ячеек распространяется на все остающееся
свободным пространство адресов.
Реализация лексического связывания переменных глубокая (deep binding)
[Allen J. Anatomy of LISP. - McGraw-Hill, 1978]: символы переменных и
их значения сводятся в пары, которые объединяются во фрагменты, напоми-
нающие ассоциативный список.
Реализация динамического связывания поверхностная (shallow binding):
новое значение переменной в момент связывания помещается в ячейку сим-
вола, а старое сохраняется в стеке. Соответствующие фрагменты стека
увязываются в список, чтобы обеспечить правильное развязывание, т.е.
восстановление старых динамических связей, при нелокальных выходах.
То, что интерпретатор написан на языке Си, облегчает его адаптацию на
компьютерах других типов и делает его гибким средством для программиро-
вания практических задач, для последующего расширения за счет подключе-
ния специализированных алгоритмов, реализованных, как правило, на язы-
ках низкого уровня. Возможен также интерфейс с пакетами машинной графи-
ки, системами баз данных на внешних носителях и т.п.
Авторы выражают готовность к любым контактам в сферах Лисп-культуры
и искусственного интеллекта и будут благодарны каждому, кто может
оказать посильное содействие в усовершенствовании
YLisp-интерпретатора или в его приложении к конкретным предметным
областям. Пожалуйста, подробнее информируйте нас о всех замеченных
ошибках и отклонениях, чтобы мы могли их исправить.
|