Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lisp 临时编辑全局变量_Lisp_Common Lisp - Fatal编程技术网

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

太棒了,谢谢你的快速回复。