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

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


examination:flp:question16

SET вычисляет имя и связывает его

При помощи функции SET символу можно присвоить (set) или связать (bind) с ним некоторое значение. Если, например, мы хотим, чтобы символ ФУНКЦИИ обозначал базовые функции Лиспа, то введем:

(set 'функции '(саг cdr cons atom eq)) 
> (САR CDR CONS ATOM EQ)

Теперь между символом ФУНКЦИИ и значением (CAR CDR CONS ATOM EQ) образована связь (binding), которая действительна до окончания работы, если, конечно, этому имени функцией SET не будет присвоено новое значение. После присваивания интерпретатор уже может вычислить значение символа ФУНКЦИИ:

_фУКЦИИ 
> (CAR CDR CONS АТОM EQ)

Обратите внимание, что SET вычисляет оба аргумента. Если перед первым аргументом нет апострофа, то с помощью функции SET можно присвоить значение имени, которое получается путем вычисления. Например, вызов

_(set (саr функции) '(взбрести в голову)) 
> (ВЗБРЕСТИ В ГОЛОВУ) 

присваивает переменной CAR выражение (ВЗБРЕСТИ В ГОЛОВУ), так как вызов (CAR ФУНКЦИИ) возвращает в качестве значения символ CAR, который и используется как фактический аргумент вызова функции SET:

_(car функции)            ; первый аргумент 
> CAR                     ; предыдущего вызова
_CAR 
> (ВЗБРЕСТИ В ГОЛОВУ)           ;присвоенное функцией SET значение 
_функции 
> (CAR CDR CONS ATOM EQl 


На значение символа можно сослаться, записав его без апострофа. Значение имени никак не проявится до тех пор, пока оно не примет участия в вычислениях. Значения символов определяются с помощью специальной функции SYMBOL-VALUE, которая возвращает в качестве своего значения значение символа, являющегося ее аргументом.

_(symbol-value (саr функции)) 
> (ВЗБРЕСТИ В ГОЛОВУ)

SETQ связывает имя, не вычисляя его

Наряду с функцией SET связать символ с его значением можно с помощью функции SETQ. Эта функция отличается от SET тем, что она вычисляет только свой второй аргумент. Об автоматическом блокировании вычисления первого аргумента напоминает буква Q (quote) в имени функции. Например:

_(setq функции '(саr cdr cons atom eq)) 
> (CAR CDR CONS ATOM EQ) 


При использовании функции SETQ отпадает надобность в знаке апострофа перед первым аргументом. (В Интерлиспе есть функция SETQQ, которая блокирует вычисление обоих аргументов.) Проверить, связан ли атом, можно с помощью предиката BOUNDP, который истинен, когда атом имеет какое-нибудь значение:

_(boundp 'без значения) 
> NIlL 
_(boundp 'функции) 
> Т 
_(boundp 't) ; константа всегда связана 
> Т 

SETF - обобщенная функция присваивания

В Коммон Лиспе значение символа сохраняется в ячейке памяти (storage location), связанной с самим символом. Под ячейками памяти при этом понимаются поля списочной ячейки, которую мы рассмотрим ниже, элементы массива и другие структуры, содержащие данные. Так же как на значения символов можно сослаться через их имена, так и на ячейки памяти можно ссылаться через вызов функции SYMBOL-VALUE и в общем случае другими способами, зависящими от типа данных. Для присваивания, т.е. занесения значения в ячейку памяти, существует обобщенная функция обновления данных SETF, которая записывает в ячейку памяти новое значение:

(SETF ячейка-памяти значение) 


Через функцию SETF можно представить описанные нами ранее функции SET и SETQ:

(setq x у) <<>> (setf х у) 
(set x у) <<>> (setf (symbol-value х) у)


_(setf список '(а b с)) 
> (А В С) 
_список 
> (А В С) 


Заметьте, что первый аргумент использован без блокировки вычисления. Переменная СПИСОК без апострофа указывает на ячейку памяти, куда помещается в качестве значения список (А В С).

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