Главная Учебники - Разные Лекции (разные) - часть 32
|
Лабораторная
работа № 1.
Тема: Ознакомительная
работа в среде
MuLisp. Базовые функции
Лиспа.
Символы, свойства
символов. Средст-ва
языка для работы
с числами.
Цель: Ознакомиться
со средой MuLisp.
Изучить базовые
функции Лиспа,
символы и их
свойства, а
также средства
для работы с
числами.
Основные
положения
программирования
на Лиспе.
Загрузка системы,
системный
редактор.
Базовые функции
языка. Символы,
свойства символов.
Средства языка
для работы с
числами.
Задание к
лабораторной
работе.
1. Основные
положения
программирования
на Лиспе.
Лисп ориентирован
на обработку
нечисловых
задач. Он основан
на алгебре
списочных
структур,
лямбда-исчислении
и теории рекурсий.
Язык имеет
функциональную
направленность,
т. е. любое предложение
заключенное
в скобки, введенное
вне редактора
считается
функцией и
выполняется
сразу после
нажатия
«ENTER».
Чтобы предотвратить
вычисление
значения выражения,
нужно перед
этим выражением
поставить
апостроф «’».
Апостроф перед
выражением
- это на самом
деле сокращение
лисповской
функции QUOTE.
В Лиспе формы
представления
программы и
обрабатываемых
ею данных одинаковы.
И то и другое
представляется
списочной
структурой
имеющей одинаковую
форму.
Типы данных
не связаны с
именами объектов
данных, а сопровождают
сами объекты.
Переменные
могут в различные
моменты времени
представлять
различные
объекты.
Основные типы
данных языка
- атомы и списки.
Атомы - это символы
и числа.
Список - упорядоченная
последовательность,
элементами
которой являются
атомы либо
списки. Списки
заключаются
в круглые скобки,
элементы списка
разделяются
пробелами.
Несколько
пробелов между
символами
эквивалентны
одному пробелу.
Первый элемент
списка называется
«головой», а
остаток , т. е.
список без
первого элемента,
называется
«хвостом. Список
в котором нет
ни одного элемента,
называется
пустым и обозначается
«()» либо NIL.
Символ - это
имя, состоящее
из букв, цифр
и специальных
знаков, которое
обозначает
какой-нибудь
предмет, объект,
действие. В
Лиспе символы
обозначают
числа, другие
символы или
более сложные
структуры,
программы
(функции) и другие
лисповские
объекты. Символы
могут состоять
как из прописных,
так и из строчных
букв, хотя в
большинстве
Лисп-систем,
как и в описываемой
здесь версии
MuLisp,
прописные и
строчные буквы
отождествляются
и представляются
прописными
буквами.
Символы T
и NIL
имеют в Лиспе
специальное
назначение:
T -
обозначает
логическое
значение истина,
а NIL
- логическое
значение ложь.
При генерации
или считывании
MuLispом
нового символа,
за его величину
принимается
он сам. Такая
ссылка символа
на себя называется
автоссылкой.
Создание программы
на Лиспе - написание
некоторой
функции, возможно
сложной, при
вычислении
использующей
другие функции
либо рекурсивно
саму себя. На
практике, написание
программ
осуществляется
записью в файл
определений
функций, данных
и других объектов
с помощью имеющегося
в программном
окружении
редактора.
Файлу присваивается
расширение
LSP.
Необязательно
делать отступы
в строках выражений,
входящих в
ваши функции.
На самом деле,
по желанию, вы
можете написать
всю программу
в одну строку.
Однако отступы
в строках и
пустые строки
делают структуру
программы
понятней и
более читабельней.
Так же выравнивание
начальных и
конечных скобок
основных выражений
помогают убедиться
в балансе ваших
скобок.
Определения
функций могут
храниться в
файлах и загружаться
используя
функцию LOAD:
(load <имя файла>)
Эта функция
загружает файл
выражений и
выполняет эти
выражения. <Имя
файла> - это
строковая
константа,
которая представляет
собой имя файла
без расширения
(подразумевается
расширение
".lsp"). Если операция
успешно завершена,
LOAD возвращает
имя последней
функции, определенной
в файле. Если
операция не
выполнена, LOAD
возвращает
имя файла в
виде строкового
выражения.
Функция LOAD не
может вызываться
из другой функции
LISP. Она должна
вызываться
непосредственно
с клавиатуры,
в то время как
ни одна другая
функция LISP не
находится в
процессе выполнения.
Интерпретатор
считает файлами,
содержащими
исходные тексты
программ на
Лиспе, все файлы,
имеющие расширение
LSP.
В связи с тем,
что диалект
MuLisp
включает в
себя сравнительно
небольшой
набор базовых
функций, указанная
Лисп-система
обеспечивается
библиотеками
Лисп-функций,
дополняющими
базовый набор
функциями,
имеющимися
в Common
Lisp-е и других
диалектах(Common.lsp,
Array.lsp
и т. д. ...).
2.
Загрузка
системы. Системный
редактор.
Запуск системы
MuLisp с
расширением
Common.lsp осуществляется
командой:
MuLisp87.com
Common.lsp.
После нескольких
секунд загрузки
на экране дисплея
появится сообщение:
MuLisp-87 IBM PC MS-DOS Version 6.01
(11/05/87)
(C ) Copyright SoftWarehouse, Inc.,
1983, 1985, 1986, 1987.
All rights Reserved Worldwide.
; Loading C:Common.lsp
После чего
появится знак
$,
означающий
приглашение
системы к работе.
Для загрузки
системного
редактора
необходимо
набрать следующую
команду:
(LOAD edit.lsp)
Системный
редактор начинает
работать. Он
чистит экран
рисует рамку
и выдает на
экран свое
меню:
Alpha, Block,
Delete, Jump, List, Options, Print, Quit, Replace, Search, Transfer,
Undelete и
Window.
Затем система
ждет, пока
пользователь
не выберет одну
из опций. Для
этого необходимо
установить
курсор на выбранной
опции и нажать
клавишу «Enter».
Переход от
одной опции
к другой производится
с помощью клавиши
«Tab».
Alpha:
включение
режима редактирования.
Block:
работа с блоком.
Выделение,
копирование,
удаление, перенос
и др.
Delete:
удаление блока,
символа, слова,
строки.
Jump:
переход в начало
или конец текста
программы,
вверх-вниз
страницы.
List:
работа со списком.
Удаление, переход
к предыдущему,
последующему.
Options:
работа с цветами,
монитором,
звуком.
Print:
печать текста
программы.
Quit:
выход из системы.
Replace:
изменение
строки.
Search:
поиск строки.
Причем строчные
и прописные
буквы различаются.
Transfer:
работа с файлами.
Запись, нахождение,
объединение,
удаление.
Undelete:
восстановление.
Window:
работа с окнами.
Открыть, закрыть,
перейти к другому
и т. д.
3. Базовые
функции языка.
Функции разбора.
Функция CAR
возвращает
в качестве
значения первый
элемент списка.
(CAR
список) р
S -
выражение (атом
либо список).
_(CAR ‘(a b c
d)) р a
_(CAR ‘((a b)
c d)) р (a
b)
_(CAR ‘(a))
р a
_(CAR NIL)
р NIL
«Голова
пустого списка
- пустой список.»
Вызов функции
CAR с
аргументом
(a b c d)
без апострофа
был бы проинтерпретирован
как вызов функции
«a» с аргументом
«b c d»,
и было бы получено
сообщение об
ошибке.
Функция CAR
имеет смысл
только для
аргументов,
являющихся
списками.
(CAR ‘a)
р Error
Функция CDR
- возвращает
в качестве
значения хвостовую
часть списка,
т. е. список,
получаемый
из исходного
списка после
удаления из
него головного
элемента:
(CDR список)
р список
Функция CDR
определена
только для
списков.
_(CDR ‘(a b c
d)) р
(b c d)
_(CDR ‘((a b)
c d)) р
(c d)
_(CDR ‘(a (b
c d))) р
((b c d))
_(CDR ‘(a)) р
NIL
_(CDR NIL) р
NIL
_(CDR ‘a) р
Error
Функция создания
CONS.
Функция CONS
строит новый
список из переданных
ей в качестве
аргументов
головы и хвоста.
(CONS голова
хвост)
Для того чтобы
можно было
включить первый
элемент функции
CONS в
качестве первого
элемента значения
второго аргумента
этой функции,
второй аргумент
должен быть
списком. Значением
функции CONS
всегда будет
список:
(CONS s-выражение
список)
р
список
_(CONS ‘a ‘(b
c)) р
(a b c)
_(CONS ‘(a b)
‘(c d)) р
((a b) c d)
_(CONS (+ 1 2) ‘(+
3)) р
(3 + 3)
_(CONS ‘(a b
c) NIL) р
((a b c))
_(CONS NIL ‘(a
b c)) р
(NIL a b c)
Предикаты ATOM,
EQ, EQL, EQUAL.
Предикат - функция,
которая определяет,
обладает ли
аргумент определенным
свойством, и
возвращает
в качестве
значения NIL
или
T.
Предикат
ATOM - проверяет,
является ли
аргумент атомом:
(ATOM s
- выражение)
Значением
вызова ATOM
будет T,
если аргументом
является атом,
и NIL
- в противном
случае.
_(ATOM ‘a) р
T
_(ATOM ‘(a b
c)) р
NIL
_(ATOM NIL) р
T
_(ATOM ‘(NIL))
р
NIL
Предикат EQ
сравнивает
два символа
и возвращает
значение T,
если они идентичны,
в противном
случае -
NIL. С помощью
EQ
сравнивают
только символы
или константы
T и
NIL.
_(EQ ‘a ‘b)
р
NIL
_(EQ ‘a (CAR
‘(a b c))) р
T
_(EQ NIL ()) р
T
Предикат EQL
работает
так же как и
EQ, но дополнительно
позволяет
сравнивать
однотипные
числа.
_(EQL 2 2) р
T
_(EQL 2.0 2.0) р
T
_(EQL 2 2.0) р
NIL
Для сравнения
чисел различных
типов используют
предикат «=».
Значением
предиката «=»
является T
в случае
равенства чисел
независимо
от их типов и
внешнего вида
записи.
(= 2 2.0) р
T
Предикат EQUAL
проверяет
идентичность
записей. Он
работает как
EQL
, но дополнительно
проверяет
одинаковость
двух списков.
Если внешняя
структура двух
лисповских
объектов одинакова,
то результатом
EQUAL будет
T.
_(EQUAL ‘a
‘a) р
T
_(EQUAL ‘(a b
c) ‘(a b c)) р
T
_(EQUAL ‘(a b
c) ‘(CONS ‘a ‘(b c))) р
T
_(EQUAL 1.0 1) р
NIL
Функция NULL
проверяет на
пустой список.
_(NULL ‘()) р
T
Вложенные
вызовы CAR
и CDR.
Комбинации
вызовов CAR
и CDR
образуют уходящие
в глубину списка
обращения, в
Лиспе для этого
используется
более короткая
запись. Желаемую
комбинацию
вызовов
CAR и
CDR можно записать
в виде одного
вызова функции:
(C...R список
)
Вместо многоточия
записывается
нужная комбинация
из букв A
и D
(для
CAR и CDR
соответственно).
В один вызов
можно объединять
не более четырех
функций CAR
и CDR.
(CADAR x) у
(CAR (CDR (CAR x)))
_(CDDAR ‘((a
b c d) e)) р
(c d)
_(CDDR ‘(k l
m)) р
(M)
Функция LIST
- создает список
из элементов.
Она возвращает
в качестве
своего значения
список из значений
аргументов.
Количество
аргументов
произвольно.
_(LIST ‘a ‘b
‘c) р
(a b c)
_(LIST ‘a ‘b
(+ 1 2)) р
(a b 3)
4.
Символы,
свойства символов.
Функции присваивания:
SET, SETQ,
SETF.
Функция SET
- присваивает
символу или
связывает с
ним некоторое
значение. Причем
она вычисляет
оба своих аргумента.
Установленная
связь действительна
до конца работы,
если этому
имени не будет
присвоено новое
значение функцией
SET.
_(SET ‘a ‘(b
c d)) р
(b c d)
_a р(b
c d)
_(SET (CAR a) (CDR
(o f g)) р
(f g)
_a р
(b c d)
_(CAR a) р
b
_b р
(f g)
Значение символа
вычисляется
с помощью специальной
функции Symbol-value,
которая возвращает
в качестве
значения значение
своего аргумента.
_(Symbol-value (CAR
a)) р
(f g)
Функция SETQ
- связывает
имя, не вычисляя
его. Эта функция
отличается
от SET
тем, что вычисляет
только второй
аргумент.
_(SETQ d ‘(l
| |||||