LISP - Globale Variable behält nach Neuinitialisierung ihren alten Wert

Ich erstelle mit Common Lisp ein Expertensystem für mein Studium. Es gibt eine globale Variable:BF -> Faktenbasis.

Ich initialisiere so:

(defvar *BF* NIL)

Meine "Hauptfunktion" ruft die Funktion "Initialisieren" auf, die die globale Variable mit Big Data setzt.

(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) 
        ))
    )
)
)

Bei der ersten Verwendung dieser Funktion, wenn ich druckeBF, Es ist in Ordnung. Dann rufe ich eine Funktion auf, die modifiziert werden sollBF :

(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)    
)

Diese Funktion funktioniert. Aber wenn ich die Funktion "initialisieren" wieder verwenden möchte, funktioniert es nicht. Wenn ich druckeBFWie kann ich meine globale Variable neu initialisieren?

Entschuldigung für mein Englisch, ich bin französisch ^

Antworten auf die Frage(1)

Ihre Antwort auf die Frage