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

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

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

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

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

Запуск:

 

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

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