MULISP3
.docFile: 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)