gpt4 book ai didi

LISP - 全局变量在重新初始化后保持其旧值

转载 作者:太空宇宙 更新时间:2023-11-03 18:53:55 25 4
gpt4 key购买 nike

我正在用 Common Lisp 创建一个专家系统供我学习。有一个全局变量:BF -> 事实库。

我是这样初始化的:

(defvar *BF* NIL)

我的“主函数”调用函数“初始化”,用大数据设置全局变量。

(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 时,它包含旧值...我该怎么做才能重新初始化我的全局变量?

对不起我的英语,我是法国人^

最佳答案

您正在修改文字数据。最好避免使用它,因为它的效果在可移植代码中是未定义的。想象一个通过共享文字列表来节省空间的编译器。

确保您的变量 *BF* 具有新分配的数据。使用 COPY-TREE每次初始化变量时复制列表。

关于LISP - 全局变量在重新初始化后保持其旧值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14071198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com