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