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-интерпретатора или в его приложении к конкретным предметным областям. Пожалуйста, подробнее информируйте нас о всех замеченных ошибках и отклонениях, чтобы мы могли их исправить. |