临时编辑全局变量

时间:2013-01-04 16:11:45

标签: lisp common-lisp

  

可能重复:
  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(或“((x 2)(3 + 2))”)。

我有第三个列表,即每当计算元素/无法计算时附加的结果。

问题: 通过我可以添加的两个元素,我创建了一个临时变量以添加到结果中。但是,尽管我做了什么,全局变量也会发生变化。

我尝试过let,lambda,各种功能等等。我已经被困了几天了,非常感谢你能给我的任何帮助:)

以下是我的意思的一个小例子:

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

输出:

  

((x 2)5)

     

((x 2)5)

1 个答案:

答案 0 :(得分:2)

当你这样做时:

(setf temp p1)

您没有制作p1引用的列表结构的副本。这两个变量现在都指的是相同的缺点单元格。然后当你这样做:

(setf (second temp) ...)

您正在修改这两个变量仍然引用的列表结构。改为:

(setf temp (copy-tree p1))