1

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

我目前正在使用 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)

4

1 回答 1

2

当你这样做时:

(setf temp p1)

您不是在复制所p1引用的列表结构。这两个变量现在都引用相同的 cons 单元格。那么当你这样做时:

(setf (second temp) ...)

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

(setf temp (copy-tree p1))
于 2013-01-04T16:17:34.573 回答