Инструменты пользователя

Инструменты сайта


examination:flp:question3

3. Константы и переменные в языке РС – Лисп.

Символы T и NIL суть встроенные константы и не могут быть переопределены (действительно - зачем?). Константа - символ, имеющий постоянное значение. Константа определяется (переопределяется) с помощью директивы defconstant. Вы всегда можете проверить, является ли некий объект символом (предикат symbolp) и узнать его имя (функция symbol-name) или значение (symbol-value).

Поскольку часть объектов Лиспа используются для представления программ, нам не всегда предоставляется возможность поместить константу в программу путем простого объявления нового Лисп-объекта — ведь вводимый объект может быть как константой, так и фрагментом самой программы. Для разрешения этой неоднозначности используется специальная форма quote. Все переменные Common Lisp могут быть разделены на два больших класса — простые переменные и имена функций. Между ними есть определенное сходство, а в ряде случаев для их определения используются даже сходные средства (например, boundp и fboundp). Однако в большинстве случаев эти два вида переменных используются для решения совершенно разных задач: одни предназначены для обращения к определенным в программе функциям, макросам и специальным формам, то есть объектам, в которых хранится исполняемый код Лисп-программы, а вторые - для обозначения (и обращения) объектов, в которых хранятся данные.

В соответствии с современными представлениями, с каждой функцией ассоциируется ее имя (некоторая конструкция function-name), которая может представлять собой либо символ, либо список из двух элементов, первым элементом которого является символ setf, а второй представляет собой собственно символ, обозначающий ссылку на определение функции.

Вызов (quote x) всегда возвращает x. Вычисление (оценка) значения object не производится, а поэтому он может представлять собой произвольный Лисп-объект, что позволяет ввести в программу на Лиспе константу, содержащую любую конструкцию. Например:

(setq a 43)
(list a (cons a 3)) 

; (43 (43 . 3))

Поскольку формы quote используются очень часто, и набивать их название постоянно просто лень, для них еще три десятка лет назад было разработано ставшее общепринятым сокращение: любая форма f, перед которой следует знак апострофа, интерпретируется как аргумент функции (quote ), которая как бы окружает f, образуя конструкцию (quote f). Например:

(setq x '(the magic quote hack))

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

(setq x (quote (the magic quote hack))) 
 (setq x (+ 3 2 1) y (cons x nil))

x устанавливается равным 6, y — также равным (6), и само значение setq равно (6). Обратите внимание, что первое присвоение выполняетося до того, как начнет выполняться второе, что позволяет использовать уже вычисленные значения.

examination/flp/question3.txt · Последние изменения: 2014/01/15 08:17 (внешнее изменение)