相关疑难解决方法(0)

在common-lisp中,如何在不更改原始列表的情况下从函数内修改list参数的一部分?

我正在尝试将列表传递给Lisp中的函数,并在函数内更改该列表的内容,而不会影响原始列表.我已经读过Lisp是按值传递的,这是真的,但还有其他事情我不太明白.例如,此代码按预期工作:

(defun test ()
    (setf original '(a b c))
    (modify original)
    (print original))
(defun modify (n)
    (setf n '(x y z))
    n)
Run Code Online (Sandbox Code Playgroud)

如果你调用(测试),即使(修改)返回(xyz),它也会打印(abc).

但是,如果您尝试仅更改列表的一部分,则无法正常工作.我认为这与列表中的内容在内存中相同或者类似的内容有关?这是一个例子:

(defun test ()
    (setf original '(a b c))
    (modify original)
    (print original))
(defun modify (n)
    (setf (first n) 'x)
    n)
Run Code Online (Sandbox Code Playgroud)

然后(测试)打印(xbc).那么如何更改函数中list参数的某些元素,就好像该列表是该函数的本地列表一样?

lisp function common-lisp parameter-passing pass-by-reference

6
推荐指数
3
解决办法
6159
查看次数