首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LISP -全局变量在重新初始化后保持原来的值。

LISP -全局变量在重新初始化后保持原来的值。
EN

Stack Overflow用户
提问于 2012-12-28 14:43:23
回答 1查看 267关注 0票数 1

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

我是这样初始化的:

代码语言:javascript
复制
(defvar *BF* NIL)

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

代码语言:javascript
复制
(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:

代码语言:javascript
复制
(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时,它包含了旧的值..。如何重新初始化全局变量?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-28 14:57:15

您正在修改文字数据。最好避免它,因为它的影响在可移植代码中没有定义。假设一个编译器通过共享文字列表来节省空间。

确保变量*BF*有新分配的数据。每次初始化变量时都使用复制树复制列表。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14071198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档