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

Работа с Лисп-системой

Разбить на страницы
Показывать лекцию целиком

Установка Лисп-системы

Система программирования на языке Лисп представляет собой комплекс функций для обработки различных структур данных, включая многоуровневые списки, числа, строки, файлы и их имена. Программа на Лиспе может дополнять их комплекс. Функции встраиваются в систему как атомы, имеющие определения на уровне исполняемого кода или языка программирования. В систему входит компилятор, обеспечивающий перевод функций с уровня языка программирования на уровень исполняемого кода, поэтому нет формальной разницы между определениями разного уровня. В целом работа Лисп-системы обеспечивается интерпретатором, вычисляющим отдельные выражения, последовательность которых и есть программа.

Диалог с Лисп-системой

Рассмотрим особенности функционирования Лисп-интерпретатора на примере системы GNU Clisp.

> clisp

Работа системы начинается с заставки вида:

> clisp

  i  i   i i i   i  i      ooooo      o              ooooooo    ooooo      ooooo
  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)Естественно, надо набрать и "Конец строки" -  "Enter".
	   

Происходит возврат к операционной системе.

[1]> (BYE)
Bye.

Основной рабочий цикл начинается с ввода данных, представляющих так называемое символьное выражение.

[1]> (CONS 1 2)

Интерпретатор вычисляет это выражение, затем печатается полученный результат и появляется очередное приглашение:

[1]> (CONS 1 2)
(1 . 2)
[2]>

При недостатке правых скобок ничего не происходит:

[1]> (CONS 1 2

Система ждет, пока не получит недостающие скобки, прежде чем предложить прочитанную форму интерпретатору:

[1]> (CONS 1 2
)
(1 . 2)
[2]>

Баланс скобок проще всего поддерживать, набирая пары "()" и вставляя потом между ними нужный текст. При наборе закрывающей скобки система на полсекунды перемещает курсор на соответствующую левую скобку, что также помогает замечать нарушения в балансе скобок.

При невозможности интерпретировать полученное данное как символьное выражение система печатает диагностическое сообщение:

[2]> (CONS A B)
*** - EVAL: variable A has no  valueEVAL: переменная A не имеет значения (перевод с английского –можно выбрать версию с русской диагностикой   
1. Break [3]>

В этом примере перед атомами "A" и "B" следует поставить апострофы, показывающие системе, что здесь эти атомы не рассматриваются как переменные. Система перешла в режим обработки прерывания, выйти из которого можно с помощью Ctrl-D (одновременное нажатие).

[5]> (cons a 'b)                                                                

*** - EVAL: variable A has no value
1. Break [6]>  Была набрана комбинация Ctrl-D            
[7]> (cons 'a 'b)                                                               
(A . B)
[8]>

Оперативную коррекцию можно делать без повторного набора текста строковым редактором. Стрелка вверх, предназначенная для перемещения курсора, здесь используется для перехода к ранее набранной строке.

[1]> (CONS 1 2)
(1 . 2)  [2]>При нажатии верхней стрелки появился текст "(CONS 1 2)"    (CONS 1 2)

Теперь эту строку можно подкорректировать:

[1]> (CONS 1 2)
(1 . 2)
[2]>  (CONS 4 5)Цифры 1 и 2  заменены на 4 и 5, затем после нажатия "Enter" получен результат.   
(4 . 5)

Можно пользоваться любым регистром при наборе имен, включая русский регистрПри подходящем драйвере При выводе происходит сведение к заглавным буквам.

[1]> (cons 'ГОЛОВА   'хвост)
(ГОЛОВА . ХВОСТ)
[2]>

Запуск Лисп-программ из файлов

Программа на Лиспе – это последовательность интерпретируемых выражений.

Представим, что подготовлен файл с именем "start.lsp":

; пример программы
(defun первый (x) (car x))   ;; определение новой функции
(print (первый '(one two)))  ;; вывод результата применения новой функции

Расширение "lsp" символизирует тексты на Лиспе. В этом файле содержится программа с построчными комментариями. Комментарии отделяются от программы символом ";".

Defun – функция трех аргументов: первый – имя объявляемой новой функции, второй – список ее аргументов, третий – тело определения. Функция " Defun " встраивает в систему новую, определяемую в программе функцию.

Print – унарная псевдо-функция, печатающая свой аргумент.

Заранее подготовленный файл с программой можно ввести и сразу исполнить с помощью функции LOAD.

[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-ой колонки.)
COMMAND ABBR DESCRIPTION
КОМАНДА СОКР. ОПИСАНИЕ
Help :h (or ?) this command list
Полный список команд
Error :e Print the recent Error Message
Вывод последнего сообщения об ошибке
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]>  stepЭтот "step" получен нажатием стрелки вверх    
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
 
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" даст многочисленные ссылки на сайты, среди которых можно найти следующее:

Адреса, выданные IE через Yandex в начале июля 2006 года
URL Комментарий
http://www.intuit.ru/ Сайт Интернет-Университета Информационных Технологий с большим числом дистанционных курсов по программированию
http://lists.unixcenter.ru/archives/mlug/2000-August/000232.html Материалы сравнения Си с Лиспом
http://www.shareware-ownload.org/lisp.php Бесплатные Lisp-системы.
http://ru.wikipedia.org/wiki/LISP/ Статья про Лисп в электронной энциклопедии.
ftp://ftp.gnu.org/gnu/clisp/release/2.29/ Сайт со свободно распространяемыми реализациями Clisp (clisp-2.29-win32.zip)
Сайт 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.

Запуск:
  clisp    - с русскими сообщениями
  clisp_en - с английскими сообщениями
  (в сеансе DOS под Windows 3.x или
   в среде DPMI, например, cwsdpmi.exe)

  L - запуск в среде без DPMI
  (можно запускать в любой среде DOS и Windows,
  но в Window 95 не будут работать многие
  файловые операции.

Внимание! Вместо ввода команд ABORT, (BYE), (QUIT) и (EXIT)
          можно нажимать клавишу <Ctrl>+Z ("конец
          текстового файла").

Для GNU Clisp она сводится к копированию ряда файлов в директрию и соответствующему редактированию файла "clisp.bat", предназначенного для запуска Лисп-системы из директории, указанной переменной " L ".

@echo off
SET L=C:\PROGRAMS\CLISP
SET CLISP_LANGUAGE=ru
%L%\lisp.exe -M %L%\lispinit.mem -x (print 'HELLO) %1

lisp.exe - базовый интерпретатор

lispinit.mem – база данных встроенных функций интерпретатора

Комплект поставки содержит документацию на английском языке и ряд примеров:

Clisp-m.txt – man-файл с описанием опций, которыми можно влиять на режим эксплуатации интерпретатора.

Xlispdoc.txt – справочник по встроенным функциям (от другой версии, но многое соответствует)

Clisp: Связь с внешним миром
(Load 'file.lsp ) Загрузка файла file.lsp, содержащего Лисп-программу
(Apropos 'str ) Выдать перечень атомов, в имена которых входит str
(Describe 'Atom ) Представить сведения о месте атома в системе
(Dribble 'file.drb ) Протокол вычислений направить в файл file.drb
(Print expr ) Напечатать результат вычисления expr
(Read ) Взять очередное выражение из входного потока
(Step expr ) Перейти к пошаговой интерпретации expr
Страницы:

Установка Лисп-системы

Система программирования на языке Лисп представляет собой комплекс функций для обработки различных структур данных, включая многоуровневые списки, числа, строки, файлы и их имена. Программа на Лиспе может дополнять их комплекс. Функции встраиваются в систему как атомы, имеющие определения на уровне исполняемого кода или языка программирования. В систему входит компилятор, обеспечивающий перевод функций с уровня языка программирования на уровень исполняемого кода, поэтому нет формальной разницы между определениями разного уровня. В целом работа Лисп-системы обеспечивается интерпретатором, вычисляющим отдельные выражения, последовательность которых и есть программа.

Диалог с Лисп-системой

Рассмотрим особенности функционирования Лисп-интерпретатора на примере системы GNU Clisp.

> clisp

Работа системы начинается с заставки вида:

> clisp

  i  i   i i i   i  i      ooooo      o              ooooooo    ooooo      ooooo
  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)Естественно, надо набрать и "Конец строки" -  "Enter".
	   

Происходит возврат к операционной системе.

[1]> (BYE)
Bye.

Основной рабочий цикл начинается с ввода данных, представляющих так называемое символьное выражение.

[1]> (CONS 1 2)

Интерпретатор вычисляет это выражение, затем печатается полученный результат и появляется очередное приглашение:

[1]> (CONS 1 2)
(1 . 2)
[2]>

При недостатке правых скобок ничего не происходит:

[1]> (CONS 1 2

Система ждет, пока не получит недостающие скобки, прежде чем предложить прочитанную форму интерпретатору:

[1]> (CONS 1 2
)
(1 . 2)
[2]>

Баланс скобок проще всего поддерживать, набирая пары "()" и вставляя потом между ними нужный текст. При наборе закрывающей скобки система на полсекунды перемещает курсор на соответствующую левую скобку, что также помогает замечать нарушения в балансе скобок.

При невозможности интерпретировать полученное данное как символьное выражение система печатает диагностическое сообщение:

[2]> (CONS A B)
*** - EVAL: variable A has no  valueEVAL: переменная A не имеет значения (перевод с английского –можно выбрать версию с русской диагностикой   
1. Break [3]>

В этом примере перед атомами "A" и "B" следует поставить апострофы, показывающие системе, что здесь эти атомы не рассматриваются как переменные. Система перешла в режим обработки прерывания, выйти из которого можно с помощью Ctrl-D (одновременное нажатие).

[5]> (cons a 'b)                                                                

*** - EVAL: variable A has no value
1. Break [6]>  Была набрана комбинация Ctrl-D            
[7]> (cons 'a 'b)                                                               
(A . B)
[8]>

Оперативную коррекцию можно делать без повторного набора текста строковым редактором. Стрелка вверх, предназначенная для перемещения курсора, здесь используется для перехода к ранее набранной строке.

[1]> (CONS 1 2)
(1 . 2)  [2]>При нажатии верхней стрелки появился текст "(CONS 1 2)"    (CONS 1 2)

Теперь эту строку можно подкорректировать:

[1]> (CONS 1 2)
(1 . 2)
[2]>  (CONS 4 5)Цифры 1 и 2  заменены на 4 и 5, затем после нажатия "Enter" получен результат.   
(4 . 5)

Можно пользоваться любым регистром при наборе имен, включая русский регистрПри подходящем драйвере При выводе происходит сведение к заглавным буквам.

[1]> (cons 'ГОЛОВА   'хвост)
(ГОЛОВА . ХВОСТ)
[2]>

Запуск Лисп-программ из файлов

Программа на Лиспе – это последовательность интерпретируемых выражений.

Представим, что подготовлен файл с именем "start.lsp":

; пример программы
(defun первый (x) (car x))   ;; определение новой функции
(print (первый '(one two)))  ;; вывод результата применения новой функции

Расширение "lsp" символизирует тексты на Лиспе. В этом файле содержится программа с построчными комментариями. Комментарии отделяются от программы символом ";".

Defun – функция трех аргументов: первый – имя объявляемой новой функции, второй – список ее аргументов, третий – тело определения. Функция " Defun " встраивает в систему новую, определяемую в программе функцию.

Print – унарная псевдо-функция, печатающая свой аргумент.

Заранее подготовленный файл с программой можно ввести и сразу исполнить с помощью функции LOAD.

[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-ой колонки.)
COMMAND ABBR DESCRIPTION
КОМАНДА СОКР. ОПИСАНИЕ
Help :h (or ?) this command list
Полный список команд
Error :e Print the recent Error Message
Вывод последнего сообщения об ошибке
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]>  stepЭтот "step" получен нажатием стрелки вверх    
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
 
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" даст многочисленные ссылки на сайты, среди которых можно найти следующее:

Адреса, выданные IE через Yandex в начале июля 2006 года
URL Комментарий
http://www.intuit.ru/ Сайт Интернет-Университета Информационных Технологий с большим числом дистанционных курсов по программированию
http://lists.unixcenter.ru/archives/mlug/2000-August/000232.html Материалы сравнения Си с Лиспом
http://www.shareware-ownload.org/lisp.php Бесплатные Lisp-системы.
http://ru.wikipedia.org/wiki/LISP/ Статья про Лисп в электронной энциклопедии.
ftp://ftp.gnu.org/gnu/clisp/release/2.29/ Сайт со свободно распространяемыми реализациями Clisp (clisp-2.29-win32.zip)
Сайт 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.

Запуск:
  clisp    - с русскими сообщениями
  clisp_en - с английскими сообщениями
  (в сеансе DOS под Windows 3.x или
   в среде DPMI, например, cwsdpmi.exe)

  L - запуск в среде без DPMI
  (можно запускать в любой среде DOS и Windows,
  но в Window 95 не будут работать многие
  файловые операции.

Внимание! Вместо ввода команд ABORT, (BYE), (QUIT) и (EXIT)
          можно нажимать клавишу <Ctrl>+Z ("конец
          текстового файла").

Для GNU Clisp она сводится к копированию ряда файлов в директрию и соответствующему редактированию файла "clisp.bat", предназначенного для запуска Лисп-системы из директории, указанной переменной " L ".

@echo off
SET L=C:\PROGRAMS\CLISP
SET CLISP_LANGUAGE=ru
%L%\lisp.exe -M %L%\lispinit.mem -x (print 'HELLO) %1

lisp.exe - базовый интерпретатор

lispinit.mem – база данных встроенных функций интерпретатора

Комплект поставки содержит документацию на английском языке и ряд примеров:

Clisp-m.txt – man-файл с описанием опций, которыми можно влиять на режим эксплуатации интерпретатора.

Xlispdoc.txt – справочник по встроенным функциям (от другой версии, но многое соответствует)

Clisp: Связь с внешним миром
(Load 'file.lsp ) Загрузка файла file.lsp, содержащего Лисп-программу
(Apropos 'str ) Выдать перечень атомов, в имена которых входит str
(Describe 'Atom ) Представить сведения о месте атома в системе
(Dribble 'file.drb ) Протокол вычислений направить в файл file.drb
(Print expr ) Напечатать результат вычисления expr
(Read ) Взять очередное выражение из входного потока
(Step expr ) Перейти к пошаговой интерпретации expr
Вернуться к учебному плану