2014-10-06 2 views
1

Я пытался изменить хэш-таблицу с помощью следующего кодаИзменение хэш-таблицы в Common Lisp и пусть

(let ((alist '(gethash key *hash-table*))) 
    (setf alist (cons 'key 'weight))) 

, но проблема в том, что она фактически не изменить хэш-таблицу (также отметим, что

(let ((alist (gethash key *hash-table*))) 
    (setf alist (cons 'key 'weight))) 

не работает, либо, в то время как следующий код работает.

(setf (gethash key *hash-table*) (cons 'key 'weight))) 

Я не могу понять, почему это работает, а другое не работает. Это полезно (за пределами этого фрагмента кода), потому что (я предполагаю), поэтому я не могу запустить функцию как

(alist-initialize (gethash key *hash-table*)) 

с определением бытия:

(defun alist-initialize (alist) 
    (setf alist (cons 'a 'b)) 

ответ

9

Установка переменной модифицирует локальная привязка. Вы не ожидали бы

(let ((a 5)) 
    (setf a 2)) 

каким-то образом изменить значение 5 к 2. Аналогично,

(let ((alist (gethash key *hash-table*))) 
    (setf alist (cons 'key 'weight))) 

не оказывает никакого влияния на (gethash key *hash-table*). Что происходит, что key он искал в *hash-table* и alist связан с возвращенным значением. Затем setf изменяет привязку alist, полностью игнорируя предыдущее связывание.

(обратите внимание, что ваша первая форма цитирует вызов [gethash][2] и, таким образом, не имеет доступа к хеш-таблице).

Ваша функция должна быть определена следующим образом:

(defun alist-initialize (key alist) 
    (setf (gethash key *hash-table*) alist)) 

и вызывается с два аргументов, а не один.

«В интересах полного раскрытия информации» CL предоставляет средства для обеспечения того, что вы хотите (см. symbol-macrolet и define-symbol-macro), но это относительно продвинутый материал, который вы должны, ИМО, игнорировать пока.

+0

В пример изменения 5 до 2 действительно полезно, спасибо. – user124577

1

Зачем вам смешивать список участников и хеш-стол? Оба они могут использоваться для аналогичных целей, но они не зависят друг от друга.

Если вы хотите, чтобы положить что-то в хэш-таблицу, вы должны написать:

(setf (gethash key *hash-table*) value) 

Если вы хотите, чтобы получить значение:

(gethash key *hash-table*)