Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Введение в программирование на Лиспе. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
1 Мб
Скачать

Л.В. Городняя, Н.А. Березин

Введение в программирование на Лиспе

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]