2013-01-04 91 views
1

可能重复:
LISP - Global variable keep their old value after reinitialization临时修改全局变量

目前,我正在做一些课程和Lisp(使用Common Lisp的),并有无处可把这个问题我有。

是相当棘手的解释,但在这里不用..

情况: 我有两个全局变量,P1 P2 &,这是多项式。我的任务是创建一个多项式计算器,目前进展顺利。我保持我的多项式元素的特定格式:3x^2 ==((x 2)3),并且我创建了两个递归运行多项式元素列表的函数。如果我想将3x^2和2x^2加在一起,答案将是5x^2(或“((x2)(3 + 2))”)。

我有第三个列表,结果,每当一个元素被计算/不能被计算时,它被追加到结果中。

问题: 有两个元素我可以加在一起,我创建一个临时变量添加到结果。然而,尽管我做了什么,全局变量也会改变。

我试图让,拉姆达,各种功能等。我一直停留几天的现在和将不胜感激任何帮助,您可以给我:)

这里有一个小例子我的意思:

(setf p1 '((x 2) 2)) 
    ;2x^2 

(setf p2 '((x 2) 3)) 
    ;3x^2 

(if (equal (first p1) (first p2)) 
    (progn 
     (setf temp p1) 
     (setf (second temp) (+ (second p1) (second p2))) 
     (append-to-result temp) 
     (print p1) 
     (print temp))) 

输出:

((×2)5)

((×2)5)

回答

2

当你这样做:

(setf temp p1) 

你not_making列表结构p1指的副本。现在这两个变量都指向相同的反馈单元。然后当你这样做:

(setf (second temp) ...) 

你正在修改该列表结构,这两个变量仍然参考。更改为:

(setf temp (copy-tree p1)) 
+0

非常感谢您的快速回复。 –