LABS1D (ЛИСП)
Описание файла
Документ из архива "ЛИСП", который расположен в категории "". Всё это находится в предмете "информатика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "рефераты, доклады и презентации", в предмете "информатика, программирование" в общих файлах.
Онлайн просмотр документа "LABS1D"
Текст из документа "LABS1D"
Лабораторная работа № 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 m n)) ð (l m n)
Функция SETF - обобщенная функция присваивания. SETF используется для занесения значения в ячейку памяти.
( SETF ячейка-памяти значение)
_(SETF ячейка ‘(a b c)) ð (a b c)
_ ячейка ð (a b c)
Переменная «ячейка» без апострофа указывает на ячейку памяти, куда помещается в качестве значения список (a b c).
Свойства символа.
В Лиспе с символом можно связать именованные свойства. Свойства символа записываются в хранимый вместе с символом список свойств. Свойство имеет имя и значение. Список свойств может быть пуст. Его можно изменять или удалять без ограничений.
(имя1 знач1 имя2 знач2 ... имяN значN )
Пусть имя студент имеет следующий список свойств:
(имя Иван отчество Иванович фамилия Иванов)
Функция GET - возвращает значение свойства, связанного с символом.
(GET символ свойство )
При отсутствии свойства функция GET возвращает NIL в качестве ответа.
_(GET ‘студент ‘имя) ð Иван
_(GET ‘студент ‘группа) ð NIL
Присваивание и удаление свойств.
Для присваивания символу свойств в MuLisp (как и в Common Lisp) отдельной функции нет. Для этого используются уже известные нам функции:
(SETF (GET символ свойство) значение)
_(SETF (GET ‘студент ’группа) ’РВ-90-1) ð РВ-90-1
_(GET ‘студент ’группа) ð РВ-90-1
Удаление свойства и его значения осуществляется псевдофункцией REMPROP:
Эта функция возвращает в качестве значения имя удаляемого свойства. Если удаляемого свойства нет, то возвращается NIL.
(REMPROP символ свойство)
_(REMPROP ‘студент ’группа) ð группа
_(GET ‘студент ’группа) ð NIL
_(REMPROP ‘студент ’ср_бал) ð NIL
Для просмотра всего списка свойств используют функцию SYMBOL-PLIST. Значением функции является весь список свойств.
(SYMBOL-PLIST ‘СИМВОЛ)
(SYMBOL-PLIST ‘студент) ð (имя Иван отчество Иванович фамилия Иванов)