LISP - глобальные переменные сохраняют свое прежнее значение после повторной инициализации
Я создаю экспертную систему с Common Lisp для моего исследования. Существует глобальная переменная:BF -> база фактов.
Я инициализирую так:
(defvar *BF* NIL)
Мой "основной функции" вызов функции "initialize", которая устанавливает глобальную переменную с большими данными.
(defun initialize ()
(setf *BF*
'(
(metric (
(CPU-utilization NIL)
(RPI NIL)
(ART NIL)
(concurent-invocation NIL)
(stall-count NIL)
(GC-bytes-in-use NIL)
(available-thread NIL)
(available-connection NIL)
(instance-count NIL)
))
(problem (
(livelock T)
(memory-leaks T)
(code-inefficient T)
(overload T)
(under-allocation T)
(internal-chokepoint T)
(thread-leaks T)
(blocking-deadlock T)
(unending-retries T)
(overuse-external-system T)
(pig-in-a-python T)
(too-many-layers T)
(backend-bottleneck T)
(frequent-GC-resource-leaks T)
(slow-backend T)
(suddenly-slow-backend T)
(nonblocking-deadlock T)
(thread-leaks T)
))
(category (
(sudden T)
(consistent T)
(periodic T)
(progressive T)
))
)
)
)
При первом использовании этой функции, когда я печатаюBF, все нормально. Затем я вызываю функцию, которая модифицируетBF :
(defun apply-rule (type name value)
; Get conclusion list for this rule
(let ((conclusion (get-conclusion name value)))
(if (null conclusion)
(if (not (equal 3 value))
(return-from appliquer-regle NIL)
(return-from appliquer-regle 'T)
)
)
; Iterate on all problems in *BF*
(dolist (e (cadr (assoc 'problem *BF*)))
; If the problem is not in conclusion list, set it value to false
(if (and (member (car e) conclusion) (equal (cadr e) 'T))
()
(setf (cadr e) NIL)
)
)
(return-from apply-rule 'T)
)
(return-from apply-rule NIL)
)
Эта функция работает. Но когда я хочу снова использовать функцию «инициализация», она не работает. Когда я печатаюBF, он содержит старые значения ... Как я могу сделать, чтобы повторно инициализировать мою глобальную переменную?
Извините за мой английский, я французский