Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Conspekt.doc
Скачиваний:
19
Добавлен:
31.08.2019
Размер:
1.39 Mб
Скачать

2.12 Функции, изменяющие значения указателей

Определим функцию, заменяющую в списке Z первое вхождение s-выражения A на s-выражение B.

(DEFUN LSUBLIS (A B Z)

(COND ((NULL Z) NIL)

((EQUAL (CAR Z) A)(CONS B (CDR Z)))

(T (CONS (CAR Z)(LSUBLIS 'A 'B (CDR Z)))))

Эта функция не только меняет А на В, но и копирует все остальные элементы списка Z. в результате ее работы создается новый список, в котором А заменено на S-выражение В. При этом исходный список остается неизменным. Причем, функция заменяет в списке Z только первое вхождение A на B.

Пример:

Пусть Z=(X Y P), тогда

(LSUBLIS 'Y 'A Z)->(X A P)

Было: Стало:

копирует

Х (CONS) Х

У А

Р Р

Но сам список Z не изменился и в памяти создалось две структуры. Вместо того, чтобы создавать новую структуру можно было сослаться на новый элемент.

Для изменения указателей используют функции:

(RPLACA arg1 arg2)

и

(RPLACD arg1 arg2),

где arg1- точечная пара, arg2- s-выражение.

RPLACA меняет указатель на первый элемент точечной пары, RPLACD- на второй. Изменение указателей влечет изменение значения переменной.

Пример:

(A.B) Z

(RPLACA Z 'Y) ->(1) (Y.B)

Т.о. будет не только вычислено значение (Y.В), но и изменено значение Z на (Y.В). Теперь если применить RPLACD, то:

(RPLACD Z 'X) ->(2) (Y.X), а не (A.X)

Определим теперь функцию RSUBLIS, используя вышеописанное.

(DEFUN RSUBLIS (A B Z)

(COND ((NULL Z) NIL)

((EQUAL (CAR Z) A)(RPLACA Z 'B))

(T (RSUBLIS 'A 'B (CDR Z)))))

Теперь вторая структура не создается и сама функция RSUBLIS работает быстрее, т.к. не вызывается функция CONS. Функциями RPLACA и RPLACD следует пользоваться весьма осторожно, в т.ч. и потому, что они могут менять не только данные, но и тела функций, также являющихся S-выражениями.

2.13 Функции read и print

Предназначены для перевода данных из внешнего представления во внутреннее и наоборот.

Функция READ не имеет аргументов и приводит выражения из той формы, в которой их записывает программист, к виду, в котором они хранятся. Функция READ читает данные из стандартного файла LISPIN или INPUT. Ее значением служит очередное S-выражение из читаемого файла.

(Read) – вызов.

Пример

(SetQ A (Read))

По умолчанию считается, что файлы LISPIN или INPUT связаны с консолью.

Функция PRINT выводит данные в стандартный файл LISPOUT или Output. Имеет один аргумент.

(Print e)

Вычисляет значение своего аргумента, переводит его во внешнее представление и печатает этот перевод. Значение функции совпадает со значением аргумента. В принципе, программист может обойтись и без этих функций, но иногда они полезны для упрощения программы, для печати промежуточных результатов или отладочной программы.

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

(OPEN <имя файла> <режим>)

Режимы- INPUT, OUTPUT.

Имя- логическое, его необходимо заранее связать с физическим именем.

Пример:

(OPEN (QUOTE TEST) (QUOTE INPUT))

Чтобы переназначить входной поток данных используют функцию RDS, выходной- WRS. Форматы:

(RDS <имя файла>),

(WRS <имя файла>).

Для обратного переключения:

(RDS NIL),

(WRS NIL).

Закрытие файла:

(CLOSE <имя файла>).

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