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

MULISP3

.doc
Скачиваний:
15
Добавлен:
09.02.2015
Размер:
66.05 Кб
Скачать

File: MULISP2.LES (c) Anno Christi 1996 == VAG ==

CLRSCRN

Это третья лабораторная работа из последовательности уроков, ко-

торые проводятся в диалоговом режиме и предназначены для освоения уча-

щимися основ ЛИСПа с использованием его диалекта muLISP. В течение

данной лабораторной работы Вы ознакомитесь с системными свойствами

символа и сами попробуете свои силы в использовании функций ЛИСПа.

CONTINUE

CLRSCRN

Рассмотрим представление и использование символов в LISPe:

Любая строка ASCII-знаков используется системой для идентификации

символов при вводе и выводе.

Внутреннее представление символа:

═════════════════════════════════

Символ - это распознаваемый обьект данных, состоящий из четырех

элементов-указателей: value, property, function и P-name. Символы

запоминаются единственным образом, в том смысле, что никакие 2 символа

в системе не могут иметь одинаковые print-имена.

Используются следующие 4 элемента:

╔═══════╤══════════╤══════════╤════════╗

║ value │ property │ function │ P-name ║

╚═══════╧══════════╧══════════╧════════╝

CONTINUE

CLRSCRN

VALUE

───────

- элемент value -- указатель текущего значения символа. Когда

символ создается, эа его значение принимается он сам, и ссылка на него

устанавливается в элементе.

Для изменения содержимого элемента значения символа используются

функции определения. При вызове функции содержимое элементов временно

переопределяется согласно формальным параметрам функции, а после ее

выполнения восстанавливаются их действительные значения.

CONTINUE

CLRSCRN

PROPERTY

──────────

- элемент property -- указатель списка свойств символа. Список

используется и модифицируется с помощью функций свойств и флагов.

Список свойств строится из пар

<индикатор, связанное_с_ним_значение_свойства>

Когда символ создается, список его свойств есть множество NIL,

обозначающее, что не имеется ни флагов, ни свойств.

Флаги в списке свойств могут различаться согласно различным

элементам списка (символам или числам).

CONTINUE

CLRSCRN

FUNCTION

──────────

- элемент function ( функция ) -- указатель определения функции

для символа. Определение функции составляется либо по шаблонам машин-

ного языка, либо на D-коде.

Когда символ создан, а определение связанной с ним функции не за-

дано, его функциональный элемент указывает на неопределенную функцию.

CONTINUE

CLRSCRN

P-NAME

────────

- элемент Р-name -- указатель на print-имя атома. Первые 2 байта

содержат длину имени атома, а остальные - само имя атома.

Следовательно, имена "ограничены" по размеру - не более 65536

символов.

Доступ к элементу P-name и телу имени ограничен вводом-выводом.

Как только тело print-имени считано или сгенерировано с помощью

строковой функции, работает алгоритм хеширования, определяющий, су-

ществует ли уже атом с таким же print-именем. Если "да", используется

существующий атом. Если "нет", создается атом с новым P-name.

Созданное однажды Р-name атома не может быть видоизменено.

CONTINUE

CLRSCRN

Системные свойства символа.

═══════════════════════════

Итак, повторим:

с символом в muLISPе связываются 4 системных свойства:

- печатное имя символа;

- текущее значение;

- список свойств;

- oпределение функции.

CONTINUE

CLRSCRN

Печатное имя символа

──────────────────────

Печатное имя символа -- уникальная последовательность знаков в

коде ASCII, которая используется интерпретатором для идентификации

символа при вводе информации и при выводе значения символа. Печатное

имя символа не может быть изменено.

Текущее значение

───────────────────

Текущим значением символа может быть любой объект muLISPа,

включая и сам этот символ. По умолчанию значением символа является сам

этот символ.

CONTINUE

CLRSCRN

Список свойств

─────────────────

Список свойств представляет собой множество пар вида:

<индикатор_свойства значение_свойства>

По умолчанию список свойств символа представляет собой пустой список.

Определение функции

─────────────────────

Если к символу обращаются, как к функции (то есть он стоит на

первом месте в списке), то определение функции, ассоциированной с этим

символом, применяется к аргументам вызова. Если с символом не было ас-

социировано определение функции, то происходит прерывание и выдается

сообщение об ошибке:

Undefined Function <печатное_имя_символа>

CONTINUE

CLRSCRN

Функции для работы с символами

════════════════════════════════

SYMBOLP

─────────

Фукция (SYMBOLP arg) возвращает T, если ее единственный аргумент

- символ, иначе -- NIL. Например:

$ (SYMBOLP 'XYZ)

$ (SYMBOLP 41)

$ (SYMBOLP '(A B C))

CONTINUE

CLRSCRN

Поскольку пробелы, скобки и другие специальные знаки имеют в

LISPе особые функции, для создания символов с такими знаками

используются двойные кавычки. Строку, содержащую служебные символы,

заключают в двойные кавычки и таким образом получают символ. Например:

$ "One Symbol"

Пустая строка "" также является символом:

$ (SYMBOLP "")

Двойные кавычки сами могут быть включены в символы, для этого

надо набрать перед кавычками обратную черту. Например:

$ "\"Microsoft\" - OK!"

CONTINUE

CLRSCRN

EQL

─────

Функция (EQL Symb1 Symb2) используется для проверки идентичности

двух символов.

Сделайте паузу, выбрав вариант "Остановить" и проверьте, можете

ли Вы сами написать пример использования этой функции. Если Вас

постигнет неудача, в следующем кадре Вы увидите как можно справиться с

решением такой задачи.

Вернуться в среду урока можно, набрав (return).

BREAK

Пример применения функции EQL:

$ (EQL (CAR (CDR '(A B C))) 'B)

CONTINUE

CLRSCRN

SET

─────

Функция ( SET dest src ) - это примитивная функция, которая

используется для присваивания значения аргумента src символу, являюще-

муся значением аргумента dest.

$ (SET 'GIRLS '(IRA LENA MASHA))

$ GIRLS

CONTINUE

CLRSCRN

SETQ

──────

Если Вы хотите, чтобы не вычислялось значение первого аргумента

функции SET, то он должен изображаться с предшествующим апострофом.

Используя функцию SETQ, можно писать имя первого аргумента без апост-

рофа, так как в этом случае апостроф ставится автоматически, однако

для предотвращения вычисления значения второго аргумента он по-прежне-

му должен предваряться апострофом. Например:

$ (SETQ LETTERS '(A B C D E F G))

CONTINUE

CLRSCRN

Часто бывает необходимо воспользоваться символом как таковым, а

не его значением. В muLISPе знак апострофа используется для подавления

оценивания символа. Например:

$ (SETQ DIGIT "ONE")

$ DIGIT

$ 'DIGIT

CONTINUE

CLRSCRN

Функции -- распознаватели

───────────────────────────

Функции-распознаватели - это утверждения, используемые для

распознавания или идентификации обьектов данных muLISP. Эти функции

работают с одним аргументом, а возвращают значения Т или NIL.

Поскольку функции используются для идентификации обьектов, они не

должны приводить к ошибкам по недействительным аргументам.

Пример - уже рассмотренная функция SYMBOLP, определяющая,

является ли символом ее аргумент:

$ (SYMBOLP 'DOG)

$ (SYMBOLP 2.5)

$ (SYMBOLP '(A B C))

$ (SYMBOLP ())

CONTINUE

CLRSCRN

Функции назначения

────────────────────

Функции назначения используются обычно для задания значений

программным переменным. Например, они позволяют изменять значения

формальных аргументов функций без необходимости вызова рекурсивных

функций, поэтому в некоторых ситуациях они могут значительно увеличить

скорость выполнения программ.

Если задаваемая переменная не является локальной (то есть не

является формальным параметром выполняющейся в данный момент функции),

заданное ей значение остается в силе и после выхода из функции. Как и

в случае с функциями модификатора, это явление называется побочным

эффектом функции.

Упрощенно говоря, эти функции являются аналогами присваивания.

CONTINUE

CLRSCRN

SET

─────

SET [symbol, object] Function

(SET символ обьект) замещает элемент значения <символа> на

указатель на <обьект> и возвращает <обьект>. Если <символ> не является

символом, то SET генерирует прерывание по ошибке "Несимвольный

аргумент".

RPLACA

────────

RPLACA и SET идентичны, однако RPLACA возвращает свой первый

аргумент, а SET - второй. Кaк правило, SET используют в том случае,

когда первый аргумент - символ, а RPLACA - тогда, когда первый

аргумент - список.

Сделайте паузу, выбрав вариант "Остановить" и проверьте, можете

ли Вы сами написать пример использования этих функций. Если Вас

постигнет неудача, на следующем экране Вы увидите определение функции

SET и примеры ее использования.

Вернуться на урок можно, набрав (return).

CONTINUE

CLRSCRN

Определение функции:

(DEFUN SET (SYM OBJ)

((SYMBOLP SYM)

((NULL SYM) OBJ)

(RPLACA SYM OBJ)

OBJ )

(BREAK (LIST 'SET SYM OBJ) '"Nonsymbolic Argument") )

Примеры:

$ (SET 'COLOR 'YELLOW)

$ COLOR

$ (SET 'LIST '(A B C))

$ (RPLACA LIST 'D)

BREAK

CLRSCRN

SETQ

──────

SETQ [symbol1, form1,..., symbolN, formN] Special form

(SETQ символ форма) оценивает <форму>, принимает за результат

значение <символа> и возвращает результат. Отметим, что SETQ - это

специальная форма и что <символ> не оценивается, он как бы находится в

кавычках.

Если <символ> не является символом, то SETQ генерирует прерывание

по ошибке "Несимвольный аргумент".

Если SETQ задана более, чем с 2-мя аргументами, оценка форм и

задание значений осуществляется последовательно. Если задано нечетное

количество аргументов, то последний символ принимается за NIL. SETQ

возвращает новое значение последнего задаваемого символа.

Сделайте паузу, выбрав вариант "Остановить" и проверьте, можете

ли Вы сами написать пример использования этой функции. Если Вас

постигнет неудача, на следующем экране Вы увидите определение функции

SETQ и примеры ее использования.

Вернуться в среду урока можно, набрав (return).

CONTINUE

CLRSCRN

Определение функции:

(DEFMACRO SETQ (SYM OBJ)

(LIST 'SET (LIST 'QUOTE SYM) OBJ) )

Примеры:

$ (SETQ LIST '(D E F))

$ LIST

$ (SETQ LIST (CDR LIST))

$ LIST

$ (SETQ SUM 5)

$ (SETQ SUM (+ 3 4) SQR (* SUM SUM))

$ SUM

$ SQR

CONTINUE

CLRSCRN

Функции свойств

─────────────────

Функции свойств предназначены для управления свойствами,

связанными с символами. CDR-элемент символа указывает на список

свойств, содержащий свойства и флаги.

Список свойств - это ASSOC-список (ASSOCiation) ключей свойств,

обьединенных в пары со значениями свойств.

CONTINUE

CLRSCRN

PUT

─────

PUT [symbol,key,object] Function

(PUT символ ключ обьект) помещает в список свойств <символа>

значение <обьекта> согласно указателю <ключ>.

Сделайте паузу, выбрав вариант "Остановить" и проверьте, можете

ли Вы сами написать пример использования этой функции. Если Вас

постигнет неудача, на следующем экране Вы увидите определение функции

PUT и примеры ее использования.

Вернуться в среду урока можно, набрав (return).

CONTINUE

CLRSCRN

Определение функции:

(DEFUN PUT (SYM KEY OBJ)

((NULL (ASSOC KEY (CDR SYM)))

(RPLACD SYM (ACONS KEY OBJ (CDR SYM)))

OBJ)

(RPLACD (ASSOC KEY (CDR SYM)) OBJ)

OBJ]

Примеры:

$ (PUT 'BOOK 'TITLE 'ULYSSES)

$ (PUT 'BOOK 'AUTHOR 'JOYCE)

$ (PUT 'GRASS 'COLOR 'GREEN)

CONTINUE

CLRSCRN

GET

─────

GET [symbol,key] Function

(GET символ ключ) возвращает значение свойства, соответствующее

<символу>, согласно указателю <ключ>. Если такого указателя не

существует, GET возвращает NIL. В приведенном ниже примере

предполагается, что была выполнена команда PUT.

На следующем экране Вы увидите определение функции GET и примеры

ее использования.

CONTINUE

CLRSCRN

Определение функции:

(DEFUN GET (SYM KEY)

((NULL (ASSOC KEY (CDR SYM))) NIL)

(CDR (ASSOC KEY (CDR SYM))) )

Примеры:

$ (GET 'BOOK 'TITLE )

$ (GET 'BOOK 'AUTHOR )

$ (GET 'GRASS 'COLOR )

CONTINUE

CLRSCRN

На этом уроке Вы познакомились с системными свойствами символа в

ЛИСПе и с функциями, наиболее часто используемыми при работе с

символами.

После окончания урока попробуйте применить полученные знания на

практике.

Задание:

Реализуйте с помощью списка свойств запоминание информации о на-

боре объектов, характеризующихся одними и теми же атрибутами.

┌───────────┐

│ THE END! │

└───────────┘

CONTINUE

$(RDS)

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