Символы, свойства символов

Функции присваивания: 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 ‘студент) ð (имя Иван отчество Иванович фамилия Иванов)

Свойства символов независимо от их значений доступны из всех контекстов пока не будут явно изменены или удалены. Изменение значения символа не влияет на другие свойства. Свойства символа передаются другому символу с помощью функции SETQ.

Средства языка для работы с числами. (Математические и логические функции).

В языке Лисп как для вызова функций, так и для записи выражения принята единообразная префиксная форма записи, при которой как имя функции или действия, так и сами аргументы записываются внутри скобок:

(f x), (g x y), (h x (g y z)) и т. д.

Арифметические действия:

(+ числа) - сложение чисел

(- число числа) - вычитание чисел из числа

(* числа) - умножение чисел

и т. д.

(+ 5 7 4) ð 16

(- 10 3 4 1) ð 2

(/ 15 3) ð 5

Сравнение чисел:

(= число числа) ð равны (все)

(< число числа) ð меньше (для всех)

(> число числа) ð больше (для всех)

и т. д.

Числовые предикаты:

(ZEROP число) ð проверка на ноль

(MINUSP число) ð проверка на отрицательность

и т. д.

Логические действия:

(NOT объект) ð логическое отрицание

(AND (формы)) ð логическое И

(OR (формы)) ð логическое ИЛИ

(AND (ATOM NIL) (NULL NIL) (EQ NIL NIL)) ð T

( NOT (NULL NIL)) ð NIL

Кроме приведенных, существует множество других, но не менее полезных функций.

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

1. Запишите последовательности вызовов CAR и CDR, выделяющие из приведенных ниже списков символ «а». Упростите эти вызовы с помощью функций C...R.

а) (1 2 3 а 4)

б) (1 2 3 4 а)

в) ((1) (2 3) (а 4))

г) ((1) ((2 3 а) (4)))

д) ((1) ((2 3 а 4)))

е) (1 (2 ((3 4 (5 (6 а))))))

2. Каково значение каждого из следующих выражений:

a) (ATOM (CAR (QUOTE ((1 2) 3 4))));

b) (NULL (CDDR (QUOTE ((5 6) (7 8)))));

c) (EQUAL (CAR (QUOTE ((7 )))) (CDR (QUOTE (5 7))));

d) (ZEROP (CADDDR (QUOTE (3 2 1 0))));

3. Проделайте следующие вычисления с помощью интерпретатора Лиспа:

а) 3.234*(45.6+2.43)

б) 55+21.3+1.54*2.5432-32

в) (34-21.5676-43)/(342+32*4.1)

4. Определите значения следующих выражений:

а) ‘(+ 2 (* 3 5))

б) (+ 2 ‘(* 3 5))

в) (+ 2 (’ * 3 5))

г) (+ 2 (* 3 ’5))

д) (quote ‘quote)

е) (quote 6)

5.1 Составьте список содержащий данные веб-лога

(ip1 ip2 ... ipN)

5.2 Для каждого лога

а) с помощью функции LIST составьте следующие списки:

· Идентификация: –.

· Авторизация: smithj.

· Дата/время: [28/OCT/2004:20:27:32-5000].

· Запрос: ``GET /Default.htm HTTP/1.1'' .

· Код состояния: 200.

· Переданное количество данных: 1270.

· Направление: ``http:/www.basegroup.ru/''

· Пользовательский агент: ''Mozilla/4.0+(compatible;+MSIE+6.0;+Windows+NT+5.0)''.

б) с помощью функций CONS и SETQ объедините полученные списки и присвойте их в виде значений символам, означающим ip каждого лога:

ipJ. - ((Идентификация) (Авторизация)( Дата/время) (Запрос)( Код состояния) (Переданное количество данных) (Направление) (Пользовательский агент)).

5.3 Для произвольно выбранных студентов с помощью базовых функций самостоятельно создайте запросы для анализа веб-лога

Вопросы.

1 Перечислите базовые функции.

2 Каковы типы аргументов базовых функций?

3 Какие значения они возвращают?

4 Что такое предикат?

5 Назовите основные отличия предикатов EQ, EQL, EQUAL и =.

6 Назовите отличия функций CONS и LIST.

7 Что такое символ?

8 Различия функций SET, SETQ, SETF?

9 Особенности свойств символов?

Наши рекомендации