Введение в программирование на Лиспе. Учебное пособие
.pdf
Л.В. Городняя, Н.А. Березин |
Введение в программирование на Лиспе |
динамического анализа, что повышает интерес к Лиспу и функциональному программированию. Современные языки и технологии программирования унаследовали опыт реализации и применения Лиспа и других языков символьной обработки. Так, например, Java берет на вооружение идеи неполной компиляции и освобождения памяти, объектно-ориентированное программирование реализует объекты похоже на списки свойств атомов Лиспа, хэштаблицы языка Perl созвучны по применению ассоциативным спискам Лиспа. Python обрабатывает программы с нетипизированными переменными.
Наследие Лиспа в информатике достойно отдельного изложения. Существуют и активно применяются более трехсот диалектов Лиспа и родственных ему языков (Interlisp, muLisp, Clisp, Scheme, Ml, Cmucl, Logo, Hope, Sisal, Haskell, Miranda и т.д.) По современным меркам реализации Лиспа компактны и непритязательны к оборудованию. Существуют свободно распространяемые версии, занимающие менее Мегабайта, пригодные к применению на любом процессоре.
В этом курсе мы сконцентрируемся на ключевой идее Лиспа - сведении понятия "программа" к взаимодействию разных категорий функций, а также на основах и методах функционального программирования. Подробно познакомимся с базисом Лиспа, проанализируем конструктивность методов программирования на Лиспе, изучим построение Лисп-системы и узнаем ее архитектурные особенности, рассмотрим методы эффективного и прикладного программирования в функциональном стиле. С математическими основами Лиспа можно ознакомиться подробнее на страницах журнала "Компьютерные инструменты в образовании", N 2-5 за 2002 год.
Выводы:
Функции могут быть использованы для построения программ. Новые функции можно конструировать на основе ранее определенных.
Программирование с помощью функций обеспечивает гибкость программ.
11
Л.В. Городняя, Н.А. Березин |
Введение в программирование на Лиспе |
Вопросы:
1.Назовите авторов различных идей в программировании.
2.Перечислите названия языков и систем программирования, а также информационных систем, с которыми вы знакомы.
3.Опишите наиболее известные принципы программирования и приемы записи программ.
4.Какие понятия и конструкции необходимо изображать в текстах программ?
1)Запись с помощью алгоритмической нотации школьного курса информатики
12
Л.В. Городняя, Н.А. Березин |
Введение в программирование на Лиспе |
Работа с Лисп-системой
Вторая лекция адресована практикам, предпочитающим изучение языка программирования сопровождать немедленным экспериментом, умеющим находить информацию в сетях и устанавливать на компьютере системы программирования. Но и новичкам имеет смысл познакомиться с системой программирования на Лиспе сразу, не дожидаясь полной картины изучаемого языка. Рассмотрим следующее: Диалог с Лисп-системой Запуск Лисп-программ из файлов Пошаговое вычисление Сайты с Лисп-системами
Установка Лисп-системы
Система программирования на языке Лисп представляет собой комплекс функций для обработки различных структур данных, включая многоуровневые списки, числа, строки, файлы и их имена. Программа на Лиспе может дополнять их комплекс. Функции встраиваются в систему как атомы, имеющие определения на уровне исполняемого кода или языка программирования. В систему входит компилятор, обеспечивающий перевод функций с уровня языка программирования на уровень исполняемого кода, поэтому нет формальной разницы между определениями разного уровня. В целом работа Лисп-системы обеспечивается интерпретатором, вычисляющим отдельные выражения, последовательность которых и есть программа.
Диалог с Лисп-системой
Рассмотрим особенности функционирования Лисп-интерпретатора на примере системы GNU Clisp.
> clisp
Работа системы начинается с заставки вида:
> clisp
i i i i i i i ooooo o |
ooooooo ooooo |
ooooo |
13
Л.В. Городняя, Н.А. Березин |
|
|
|
|
Введение в программирование на Лиспе |
|||||
I I I I I I I 8 |
8 8 |
8 |
8 |
|
o 8 |
8 |
||||
I |
\ `+' / |
I |
8 |
|
8 |
8 |
8 |
|
8 |
8 |
\ |
`-+-' |
/ |
8 |
|
8 |
8 |
ooooo |
8oooo |
||
`-__|__-' |
|
8 |
|
8 |
8 |
|
8 8 |
|
||
|
| |
|
8 |
o |
8 |
8 |
o |
8 |
8 |
|
------+------ |
|
ooooo |
8oooooo |
ooo8ooo |
ooooo |
8 |
||||
Copyright (c) Bruno Haible, Michael Stoll 1992, 1993 Copyright (c) Bruno Haible, Marcus Daniels 1994-1997
Copyright (c) Bruno Haible, Pierpaolo Bernardi, Sam Steingold 1998 Copyright (c) Bruno Haible, Sam Steingold 1999-2002
[1]>
Символ " > " - приглашение к вводу выражений для интерпретации. Выход из Лисп-системы осуществляется как вызов функции " BYE "
[1]> (BYE)1)
Происходит возврат к операционной системе.
[1]> (BYE) Bye.
Основной рабочий цикл начинается с ввода данных, представляющих так называемое символьное выражение.
[1]> (CONS 1 2)
Интерпретатор вычисляет это выражение, затем печатается полученный результат и появляется очередное приглашение:
[1]> (CONS 1 2) (1 . 2)
[2]>
При недостатке правых скобок ничего не происходит:
[1]> (CONS 1 2
Система ждет, пока не получит недостающие скобки, прежде чем
14
Л.В. Городняя, Н.А. Березин |
Введение в программирование на Лиспе |
предложить прочитанную форму интерпретатору:
[1]> (CONS 1 2
)
(1 . 2) [2]>
Баланс скобок проще всего поддерживать, набирая пары "()" и вставляя потом между ними нужный текст. При наборе закрывающей скобки система на полсекунды перемещает курсор на соответствующую левую скобку, что также помогает замечать нарушения в балансе скобок.
При невозможности интерпретировать полученное данное как символьное выражение система печатает диагностическое сообщение:
[2]> (CONS A B)
*** - EVAL: variable A has no value2)
1.Break [3]>
Вэтом примере перед атомами "A" и "B" следует поставить апострофы, показывающие системе, что здесь эти атомы не рассматриваются как переменные. Система перешла в режим обработки прерывания, выйти из которого можно с помощью Ctrl-D (одновременное нажатие).
[5]> (cons a 'b)
*** - EVAL: variable A has no value 1. Break [6]> 3)
[7]> (cons 'a 'b) (A . B)
[8]>
Оперативную коррекцию можно делать без повторного набора текста строковым редактором. Стрелка вверх, предназначенная для перемещения курсора, здесь используется для перехода к ранее набранной строке.
[1]> (CONS 1 2)
(1 . 2) [2]>4) (CONS 1 2)
15
Л.В. Городняя, Н.А. Березин |
Введение в программирование на Лиспе |
Теперь эту строку можно подкорректировать:
[1]> (CONS 1 2) (1 . 2)
[2]> (CONS 4 5)5) (4 . 5)
Можно пользоваться любым регистром при наборе имен, включая русский регистр6) При выводе происходит сведение к заглавным буквам.
[1]> (cons 'ГОЛОВА 'хвост) (ГОЛОВА . ХВОСТ)
[2]>
Запуск Лисп-программ из файлов
Программа на Лиспе – это последовательность интерпретируемых выражений.
Представим, что подготовлен файл с именем "start.lsp":
; пример программы
(defun первый (x) (car x)) ;; определение новой функции
(print (первый '(one two))) ;; вывод результата применения новой функц
Расширение "lsp" символизирует тексты на Лиспе. В этом файле содержится программа с построчными комментариями. Комментарии отделяются от программы символом ";".
Defun – функция трех аргументов: первый – имя объявляемой новой функции, второй – список ее аргументов, третий – тело определения. Функция " Defun " встраивает в систему новую, определяемую в программе функцию.
Print – унарная псевдо-функция, печатающая свой аргумент.
Заранее подготовленный файл с программой можно ввести и сразу исполнить с помощью функции LOAD.
16
Л.В. Городняя, Н.А. Березин |
Введение в программирование на Лиспе |
[1]> (LOAD 'start.lsp) T
ONE [2]>
Перед именем файла ставится апостроф. Результат " T " означает, что чтение файла прошло успешно. При чтении файла произошла интерпретация содержащихся в нем выражений. Чтобы увидеть результаты работы программы здесь применение функции оформлено как аргумент псевдо-функции " PRINT ".
На примерах видно, что символьное выражение может выглядеть как имя, число или круглоскобочная структура.
Пошаговое вычисление
В системе имеется функция " STEP ", обеспечивающая пошаговую интерпретацию сложных выражений.
Унарная функция " STEP " выполняет пошаговую интерпретацию своего аргумента. Ее работа начинается с приглашения выбрать действие по управлению интерпретацией (см. таблицу):
[2]> (step (cons (car '(a . b)) 'd )) step 1 --> (CONS (CAR '(A . B)) 'D ) Step 1 [3]>
Таблица 2.1. Первоочередные средства управления пошаговой интерпретацией символьных выражений. (Можно пользоваться сокращенными обозначениями из 2-ой колонки.)
COMMAND |
|
ABBR |
|
DESCRIPTION |
|
|
|
|
|
КОМАНДА |
|
СОКР. |
|
ОПИСАНИЕ |
|
|
|
|
|
Help |
|
:h (or |
|
this command list |
|
|
?) |
|
|
|
|
|
||
Полный список команд |
|
|
||
|
|
|
|
|
Error |
|
:e |
|
Print the recent Error Message |
Вывод последнего сообщения об ошибке
17
Л.В. Городняя, Н.А. Березин |
|
Введение в программирование на Лиспе |
||||
|
Continue |
|
:c |
|
continue evaluation |
|
|
|
|||||
|
Продолжение вычислений |
|
||||
|
|
|
|
|
|
|
|
Step |
|
:s |
|
step into form: evaluate this form in single step |
|
|
|
|
mode |
|
||
|
|
|||||
|
Продвижение к внутреннему подвыражению |
|
||||
|
|
|
|
|
|
|
|
Next |
|
:n |
|
step over form: evaluate this form at once |
|
Вычисление данной формы сразу, полностью
По действию "step" выбирается вычисление первого аргумента функции
"CONS":
Step 1 [2]> (step (cons (car '(a . b)) 'd ))
Step 1 |
--> (CONS (CAR '(A . B)) 'D ) |
Step 1 |
[3]> step |
Step 2 |
--> (CAR '(A . B)) |
Step 2 |
[4]> |
Это же действие "step" теперь можно выбирать с помощью стрелки вверх:
Step 1 [2]> (step (cons (car '(a . b)) 'd))
Step 1 --> (CONS (CAR '(A . B)) 'D)
Step 1 [3]> step
Step 2 --> (CAR '(A . B))
Step 2 [4]> step7)
Step 3 --> '(A . B)
Step 3 [5]>
Теперь шаг за шагом смотрим как интерпретатор перебирает подвыражения и получает их значения:
(step (cons (car '(a . b)) 'd ))
step 1 --> (CONS (CAR '(A . B)) 'D) Step 1 [15]> step
step 2 --> (CAR '(A . B)) Step 2 [16]> step
step 3 --> '(A . B) Step 3 [17]> step
18
Л.В. Городняя, Н.А. Березин |
Введение в программирование на Лиспе |
step 3 ==> value: (A . B) step 2 ==> value: A step 2 --> 'D
Step 2 [18]> step
step 2 ==> value: D step 1 ==> value: (A . D) (A . D)
Step 1 [14]>
Сайты с Лисп-системами
Интернет-браузер на запрос "Lisp" даст многочисленные ссылки на сайты, среди которых можно найти следующее:
Таблица 2.1. Адреса, выданные IE через Yandex в начале июля 2006 года
|
URL |
|
Комментарий |
|
|
|
|
|
|
|
|
|
Сайт Интернет- |
|
|
|
|
Университета |
|
|
|
|
Информационных |
|
|
ссылка: http://www.intuit.ru/ |
|
Технологий с большим |
|
|
|
|
числом дистанционных |
|
|
|
|
курсов по |
|
|
|
|
программированию |
|
|
|
|
|
|
|
ссылка: |
|
Материалы сравнения |
|
|
http://lists.unixcenter.ru/archives/mlug/2000- |
|
|
|
|
|
Си с Лиспом |
|
|
|
August/000232.html |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ссылка: http://www.shareware- |
|
Бесплатные Lisp- |
|
|
ownload.org/lisp.php |
|
системы. |
|
|
|
|
|
|
|
|
|
Статья про Лисп в |
|
|
ссылка: http://ru.wikipedia.org/wiki/LISP/ |
|
электронной |
|
|
|
|
энциклопедии. |
|
|
|
|
|
|
|
|
|
Сайт со свободно |
|
|
ссылка: ftp://ftp.gnu.org/gnu/clisp/release/2.29/ |
|
распространяемыми |
|
|
|
|
|
19
Л.В. Городняя, Н.А. Березин |
|
Введение в программирование на Лиспе |
||
|
|
|
реализациями Clisp (clisp- |
|
|
|
|
2.29-win32.zip) |
|
|
|
|
|
|
|
ссылка: http://www.cs.cmu.edu/~dst/Lisp/ |
|
Сайт CMU |
|
|
|
|
|
|
|
ссылка: http://penguin.kurgan.ru/doc/lisp.html |
|
Про AutoLisp |
|
|
|
|
|
|
|
|
|
Сайт фирмы, |
|
|
ссылка: http://www.ystok.ru/index.html |
|
использующей Лисп в |
|
|
|
качестве базовой |
|
|
|
|
|
|
|
|
|
|
технологии |
|
Сайт Морозова с ссылка: введением в
http://www.marstu.mari.ru/mmlab/home/lisp/title.htm программирование на Лиспе
ссылка: http://vspu.ac.ru/~lmiker/5im/rezn.htm
Сайт Микеровой с учебником по Лиспу
Сайт Заочной школы программирования и Информационных технологий, включающий материалы по Лиспу
Можно воспользоваться комплектом GNU Clisp.
Установка Лисп-системы
Установка системы GNU Clisp досаточно проста и описана в readme комплекта поставки:
GNU Common Lisp
Для установки:
В файлах *.bat поместить после
"SET L=" наименование каталога, где установлен
CLISP.
20
