如何制作一个更改了列表的 2 个位置的新列表?

How to make a new list with 2 positions of a list changed?

我是 LISP(准确地说是 Common lisp)的新手,我需要创建一个函数,我可以在其中传递列表和 2 个参数,pos1 pos2,它们是列表中的元素位置,函数然后应该 return 一个新列表,其中包含交换位置的元素。

例子 (changepos '(a b c d) 0 3) -> (D B C A)

你是对的 - rotatef modifies the given list. But you can use copy-list or copy-tree(对于嵌套列表)在你的函数中并修改该副本:

(defun changepos (list i j)
  (let ((new-list (copy-tree list)))
    (rotatef (nth i new-list)
             (nth j new-list))
    new-list))

测试:

> (defparameter *aa* (list 1 2 3 4 5))
*AA*

> (changepos *aa* 1 3)
(1 4 3 2 5)

> *aa*
(1 2 3 4 5)