Лабораторная работа № 1.

Тема: Ознакомительная работа в среде MuLisp. Базовые функции Лиспа. Символы, свойства символов. Средст-ва языка для работы с числами.

Цель: Ознакомиться со средой MuLisp. Изучить базовые функции Лиспа, символы и их свойства, а также средства для работы с числами.


  1. Основные положения программирования на Лиспе.

  2. Загрузка системы, системный редактор.

  3. Базовые функции языка. Символы, свойства символов.

  4. Средства языка для работы с числами.

  5. Задание к лабораторной работе.

  6. Вопросы.


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.


Случайные файлы

Файл
57922.rtf
103869.rtf
17274.rtf
~1.DOC
80610.rtf




Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.