Lisp 临时编辑全局变量
可能重复:Lisp 临时编辑全局变量,lisp,common-lisp,Lisp,Common Lisp,可能重复: 我目前正在做一些关于Lisp(使用Common Lisp)的课程作业,没有其他地方可以解决这个问题 解释起来很难,但还是这样吧 情况: 我有两个全局变量,p1和p2,它们是多项式表达式。我的任务是创建一个多项式计算器,目前进展顺利 我将多项式元素保存在一个特定的格式中:3x^2==((x2)3),并且我创建了两个函数,递归地遍历两个多项式元素列表 如果我想把3x^2和2x^2相加,答案是5x^2(或“((x2)(3+2))”) 我有第三个列表,即结果,每当元素被计算/无法计算时,都
我目前正在做一些关于Lisp(使用Common Lisp)的课程作业,没有其他地方可以解决这个问题 解释起来很难,但还是这样吧 情况: 我有两个全局变量,p1和p2,它们是多项式表达式。我的任务是创建一个多项式计算器,目前进展顺利 我将多项式元素保存在一个特定的格式中:3x^2==((x2)3),并且我创建了两个函数,递归地遍历两个多项式元素列表 如果我想把3x^2和2x^2相加,答案是5x^2(或“((x2)(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)))
输出:
(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)))
((x2)5)
((x2)5)
当您这样做时:
(setf temp p1)
(setf (second temp) ...)
您没有复制p1
引用的列表结构。这两个变量现在引用相同的cons单元格。然后,当您这样做时:
(setf temp p1)
(setf (second temp) ...)
您正在修改这两个变量仍然引用的列表结构。改为:
(setf temp (copy-tree p1))
太棒了,谢谢你的快速回复。