Введение в программирование на Лиспе. Учебное пособие
.pdf
Л.В. Городняя, Н.А. Березин |
Введение в программирование на Лиспе |
Запуск: |
|
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 – справочник по встроенным функциям (от другой версии, но многое соответствует)
Таблица 2.2. Clisp: Связь с внешним миром
Загрузка файла file.lsp, содержащего Лисп-
(Load 'file.lsp ) программу
21
Л.В. Городняя, Н.А. Березин |
Введение в программирование на Лиспе |
(Apropos 'str )
(Describe 'Atom )
(Dribble 'file.drb )
(Print expr )
(Read )
(Step expr )
Выдать перечень атомов, в имена которых входит str
Представить сведения о месте атома в системе
Протокол вычислений направить в файл file.drb
Напечатать результат вычисления expr
Взять очередное выражение из входного потока
Перейти к пошаговой интерпретации expr
1)Естественно, надо набрать и "Конец строки" - "Enter".
2)EVAL: переменная A не имеет значения (перевод с английского – можно выбрать версию с русской диагностикой
3)Была набрана комбинация Ctrl-D
4)При нажатии верхней стрелки появился текст "(CONS 1 2)"
5)Цифры 1 и 2 заменены на 4 и 5, затем после нажатия "Enter" получен результат.
6)При подходящем драйвере
7)Этот "step" получен нажатием стрелки вверх
22
Л.В. Городняя, Н.А. Березин |
Введение в программирование на Лиспе |
Списки и атомы
Третья лекция знакомит с основами символьной обработки информации и структурами данных, удобно приспособленными для символьной обработки. Рассматривается базовый набор элементарных функций над списками и S-выражениями (символьными выражениями).
Основы символьной обработки
Идеальный Лисп изначально поддерживает программирование в функциональном стиле. Его основа - выбор подходящей структуры данных и базового набора функций над выбранной структурой. Информационная обработка в языке Лисп отличается от стандартных подходов к программированию тремя важными особенностями:
1.Природа данных
Любая информация представляется в форме символьных выражений1) Система программирования над такими структурами обычно использует для их хранения всю доступную память, поэтому программист принципиально освобожден от заботы о распределении памяти под отдельные блоки данных.
2.Самоописание обработки символьных выражений
Важная особенность программ на Лиспе - они строятся из рекурсивных функций, определения и вызовы которых, как и любая информация, формально могут обрабатываться как обычные данные, получаться в процессе вычислений как значения и преобразовываться как символьные выражения.
3.Подобие машинным языкам
Система программирования на Лиспе допускает, что программа может интерпретировать и/или компилировать программы, представленные в виде символьных выражений. Это сближает программирование на Лиспе с методами низкоуровневого программирования и отличает от традиционной методики
применения языков высокого уровня.
23
Л.В. Городняя, Н.А. Березин |
Введение в программирование на Лиспе |
Структуры данных
Любые структуры данных строятся из более простых составляющих, простейшие из которых – элементарные данные. В Лиспе элементарные данные называют атомами. Для начала примем, что атом – это последовательность из букв и цифр, начинающаяся с буквы.
A
Nil ATOM LISP
Занятие2 Новый_год
ВотДлинныйАтомНуОченьДлинныйНоЕслиНадоАтомМожетБытьЕще Ф4длш139к131б
Пример 3.1.
Одинаково выглядящие атомы не различимы по своим свойствам. Термин "атом" выбран по аналогии с химическими атомами, строение которых – предмет другой науки. Согласно этой аналогии атом может иметь достаточно сложное строение, но атом не предназначен для разбора на части базовыми средствами языка.
Более сложные данные в Лиспе выстраиваются из одинаково устроенных бинарных узлов, содержащих пары объектов произвольного вида. Каждый бинарный узел соответствует минимальному блоку памяти, выделяемому системой программирования при организации и обработке структур данных. Выделение блока памяти и размещение в нем пары данных выполняет функция CONS (от слова consolidation), а извлечение левой и правой частей из блока выполняют функции CAR и CDR соответственно ("content of address part of register" , "content of decrement part of register").
Функция Аргументы Результат
Атом
Cons ( Атом . X ) X
24
Л.В. Городняя, Н.А. Березин |
|
|
Введение в программирование на Лиспе |
|||
|
|
|
|
|
|
|
Car ( Атом . X ) Атом
Cdr ( Атом . X ) X
При работе с системой соответствующие выражения показаны ниже:
Функция Аргументы Вид для системы
Cons |
|
Атом |
|
(CONS 'ATOM ' X ) |
|
X |
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
||
Car |
|
( Атом . X ) |
|
(CAR '(ATOM . X )) |
|
|
|
||
Cdr |
|
( Атом . X ) |
|
(CDR '(ATOM . X )) |
Типичная форма записи символьных выражений называется списочной записью ( list-notation ). Элементы списка могут быть любой природы.
Список – это перечень произвольного числа элементов, разделенных пробелами, заключенный в круглые скобки.
По соглашению атом Nil выполняет роль пустого списка. Бинарный узел, содержащий пару атомов ATOM и Nil, рассматривается как одноэлементный список (ATOM ):
или для наглядности:
Если вместо атома " ATOM " подставлять произвольные атомы, а вместо " Nil " - произвольные списки, затем вместо атомов - построенные списки и так далее, то мы получим множество всех возможных списков. Можно уточнить, что список - это заключенная в скобки последовательность из разделенных пробелами атомов или списков.
25
Л.В. Городняя, Н.А. Березин |
Введение в программирование на Лиспе |
(C )
(B C )
(C (A B))
Пример 3.2.
Упражнения 3.1.: Нарисуйте диаграммы для списков вида:
((A B) C)
((A B) (D C))
((A B)(D(C E)))
Любой список может быть построен из пустого списка и атомов с помощью CONS и любая его часть может быть выделена с помощью подходящей композиции CAR-CDR.
CONS - Функция, которая строит списки из бинарных узлов, заполняя их парами объектов, являющихся значениями пары ее аргументов.
26
Л.В. Городняя, Н.А. Березин |
Введение в программирование на Лиспе |
Первый аргумент произвольного вида размещается в левой части бинарного узла, а второй, являющийся списком, - в правой.
CAR – Функция, обеспечивающая доступ к первому элементу списка - его "голове".
CDR – Функция, укорачивающая список на один элемент. Обеспечивает доступ к "хвосту" списка, т.е. к остатку списка после удаления его головы.
ATOM - Функция, различающая составные и атомарные объекты. На атомах ее значение "истина", а на более сложных структурах данных – "ложь".
EQ – Функция, которая проверяет атомарные объекты на равенство.
Таблица 3.1. Элементарные функции над списками. Примеры соответствия между аргументами и результатами элементарных функций обработки списков.
|
Функция |
|
Аргументы |
|
Результат |
|
|
|
|
|
|
||
|
|
|
Конструирование структур данных |
|
||
|
|
|
|
|
|
|
|
CONS |
|
A и Nil |
|
(A ) |
|
|
|
|
|
|
|
|
|
CONS |
|
(A B) и Nil |
|
((A B) ) |
|
|
|
|
|
|
|
|
|
CONS |
|
A и (B) |
|
(A B) |
|
|
|
(Результат предыдущего |
|
|
||
|
CONS |
|
|
((A B) C) |
|
|
|
|
CONS) и ( C ) |
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CONS |
|
A и (B C) |
|
(A B C) |
|
|
|
|
|
|
||
|
|
|
Доступ к компонентам структуры данных: |
|
||
|
|
|
|
|
|
|
|
|
|
Слева |
|
|
|
|
|
|
|
|
|
|
|
CAR |
|
(A B C) |
|
A |
|
|
|
|
|
|
|
|
|
CAR |
|
(A (B C)) |
|
A |
|
|
|
|
|
|
|
|
|
CAR |
|
((A B) C) |
|
(A B) |
|
|
|
|
|
|
|
|
|
CAR |
|
A |
|
Не определен |
|
|
|
|
|
|
|
|
|
|
|
Справа |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
27
Л.В. Городняя, Н.А. Березин |
Введение в программирование на Лиспе |
CDR
CDR
CDR
CDR
CDR
CDR
CAR
CAR
CAR
CONS
CAR
CONS
CDR
ATOM
ATOM
CDR
ATOM
ATOM ATOM
EQ
(A ) |
|
Nil |
|
|
|
(A B C D) |
|
(B C D) |
|
|
|
(A (B C)) |
|
((B C)) |
|
|
|
((A B) C) |
|
( C ) |
|
|
|
A |
|
Не определен |
Обработка данных: |
||
|
|
|
(A B C) |
|
(B C) |
Результат предыдущего CDR |
|
B |
|
|
|
|
|
|
(A C) |
|
A |
Результат предыдущего CAR |
|
Не определен |
|
|
|
|
|
|
A и (B) |
|
(A B) |
Результат предыдущего CONS |
|
A |
|
|
|
A и (B) |
|
(A B) |
Результат предыдущего CONS (B)
Предикаты:
Атомарность – неделимость
VeryLongStringOfLetters |
|
T |
|
|
|
( A B ) |
|
Nil - выполняет роль ложного |
|
значения |
|
|
|
|
|
|
|
( A B ) |
|
(B) |
Результат предыдущего CDR |
|
Nil |
|
|
|
|
|
|
Nil |
|
T |
|
|
|
( ) |
|
T |
Равенство |
||
|
|
|
A A |
|
T |
|
|
|
|
|
|
28
Л.В. Городняя, Н.А. Березин |
|
Введение в программирование на Лиспе |
||||
|
EQ |
|
A B |
|
Nil |
|
|
|
|
|
|
|
|
|
EQ |
|
A (A B) |
|
Nil |
|
|
|
|
|
|
|
|
|
EQ |
|
(A B) (A B) |
|
Не определен |
|
|
|
|
|
|
|
|
|
EQ |
|
Nil и () |
|
T |
|
Различие истинностных значений в Лиспе принято отождествлять с разницей между пустым списком и остальными объектами, которым программист может придать в программе некоторый другой смысл. Таким образом, значение "ложь" – это всегда Nil.
Если требуется явно изобразить значение "истина", то используется стандартная константа – атом T (true), но роль значения "истина" может выполнить любой, отличный от пустого списка, объект.
Упражнение 3.2. Посмотрите, что сделает Лисп-система с ниже приведенными выражениями2), сравнивая результаты с данными из таблицы 3.1:
(CONS 'Head Nil ) (CONS 'Head '(Body Tail) ) (CAR '(Head Body Tail)) (CDR '(Head Body Tail)) (ATOM 'Body)
(ATOM '(Body)) (ATOM ())
(ATOM (CAR '(Head Body Tail))) (EQ Nil ())
Точечная нотация
При реализации Лиспа в качестве единой универсальной базовой структуры для конструирования символьных выражений использовалась так называемая "точечная нотация" ( dot-nоtation ), согласно которой левая и правая части бинарного узла равноправны и могут хранить данные любой природы.
Бинарный узел, содержащий пару атомов ATOM1 и ATOM2,
29
Л.В. Городняя, Н.А. Березин |
Введение в программирование на Лиспе |
можно представить как запись вида:
( ATOM1 . ATOM2 )
Если вместо атомов " ATOM1 ", " ATOM2 " рекурсивно подставлять произвольные атомы, затем построенные из них пары и так далее, то мы получим множество всех возможных составных символьных выражений – S-выражений.
S-выражение - это или атом или заключенная в скобки пара из двух S- выражений, разделенных точкой.
Все сложные данные создаются из одинаково устроенных блоков - бинарных узлов, содержащих пары объектов произвольного вида. Каждый бинарный узел соответствует минимальному блоку памяти.
Списки – это подмножество S-выражений, движение вправо по которым завершается атомом Nil.
(A . B)
(C . (A . B))
30
