Расширения и приложения Лиспа
На примере GNU Clisp ( Common Lisp language interpreter and compiler) рассмотрим типичные возможности Лисп-систем, описанные в man-файле комплекта поставки [GNU Clisp]1См. Файлы clisp.bat и read.me
Вызов Лисп-интерпретатора и/или компилятора.
Без аргументов (опций) выполняется цикл "чтение-вычисление-печать", при котором выражения читаются поочередно из стандартного потока ввода, вычисляются Лисп-интепретатором, и полученные результаты выводятся в стандартный поток вывода. Опция –c специфицирует Лисп-файлы, предназначенные для компиляции в байт-код, который выполняется более эффективно.
Формат вызова Лисп-системы:
clisp [ -h ] [ -m memsize ] [ -M memfile ]
[ -L language ] [ -N directory ] [ -q ] [ -I ]
[ -i initfile ... ] [ -c [ -l ] lispfile
[ -o outputfile ] ... ] [ -p packagename ] [ -x expression ]2Заключение в квадратные скобки означает возможное отсутствие. Многоточие – многократное вхождение предшественника
OPTIONS
-h Показывает формат вызова Лисп-системы
-m memsize Установливает объем памяти. Для современных версий игнорируется.
-M memfile Определяет внутреннее наполнение памяти Лисп-системы. Оно должно быть создано функцией "saveinitmem".
-L language Задает язык сообщений для взаимодействия с пользователем. (английский, немецкий, французский и др.) Влияет на тексты диагностики.
-N directory Указывает, где искать файлы с текстами сообщений.
-q Ни заставки, ни прощального текста не выдается.
-I вариант диалога в стиле ILISP (популярный интерфейс, принятый в редакторе Emacs)
-i initfile ... Специфицирует инициализирующие файлы, которые будут загружены при запуске системы. Это должны быть исходные или компилированные Лисп-файлы,
-c lispfile ... Компилирует специфицированные Лисп-файлы в байт-код. Компилированные файлы затем загружаются вместо исходных, чтобы повысить эффективность.
-o outputfile Задает файл вывода или директорию для компиляции предшествующего лисп-файла.
-l будет выполняться листинг байткода для компилируемых файлов. Полезно только для целей отладки.
-p packagename При загрузке устанавливает начальное значение переменной *package*
-x expressions Выполняет серию произвольных выражений вместо цикла "read-eval-print". Значения выражений выводятся в стандартный поток вывода. Согласно системным соглашениям выражения должны быть заключены в скобки, а двойным кавычкам и обратным чертам следует предпослать обратную черту.
@optionfile Подставляет содержимое файла как аргумент для запуска Лисп-системы. Каждая строка воспринимается как отдельный аргумент.
При работе с Лисп-системой полезны следующие возможности:
(apropos name) перечисляет символы, включающеие " name "
(exit) or (quit) or (bye) - выход из Лисп-системы
EOF (Ctrl-Z) Покидает текущий " read-eval-print " цикл
Стрелки управления курсором позволяют построчно редактировать и просматривать историю ввода текста программы.
Соглашение об именах файлов:
lispinit.mem исходный/начальный образ/состояние памяти
config.lsp конфигурация и настройки
*.lsp исходные тексты на Лиспе
*.fas результат компиляции – байт-код
*.lib библиотечная информация, создаваемая и используемая компилятором
*.c Си-код, компилированный по исходному Лисп-тексту
Практичные расширения Лиспа
Средства и методы программирования на Лиспе образуют два слоя. Глубинный слой - локальное программирование, нацеленное на определение:
- строгих функций,
- безотходных структур данных,
- регулярных отображений,
- методов оперирования вычислениями.
Внешний слой - моделирование практичных парадигм программирования и механизмов их реализации:
- прототипы и макеты программ,
- интеграция разных стилей и методов программирования,
- учебное и экспериментальное программирование,
- проверка новых идей и подходов к организации информационных систем.
Естественно, работа на внешнем слое требует своей терминологии и развития понятий, отражающего расширение класса решаемых задач, повышение уровня общности и организованности решений:
Реальные Лисп-системы обеспечивают полный спектр средств работы с числами с особым вниманием к повышенной точности вычислений и длине представления числа. Средства обработки структур данных обычно позволяют работать с векторами, строками, массивами, хэш-таблицами, деревьями, последовательностями и файлами. Имеется работа с мульти-значениями, удобная при моделировании параллельных вычислений.
Строение Лисп-системы формируется как взаимодействие интерпретатора и компилятора, что позволяет гибко сочетать достоинства того и другого подходов к обработке программ. Для нужд компиляции программа дополняется спецификациями типов данных и декларациями, указывающими направление наследования определений. Имеются средства подготовки и использования встроенной документации и системной информации относительно фактического контекста вычислений. Обстановка функционирования системы регулируется механизмом пакетов, в составе которых хранятся различные варианты определений символов, включаемых в создаваемый комплект.
Так, например, пакет CLOS (Common Lisp Object System) поддерживает ООП в терминах классов, методов, суперклассов, экземпляров и семейств функций, подчиненных механизмам инкапсуляции и наследования с управляемым полиморфизмом.