Common lisp lisp上的堆栈溢出更改列表上的2个元素

Common lisp lisp上的堆栈溢出更改列表上的2个元素,common-lisp,Common Lisp,我使用此函数交换列表中的两个元素: (defun change-path (List) (setf len (list-length List)) (setf x1 (random len)) (setf x2 (random len)) (setf e1 (get-n-element List x1)) (setf e2 (get-n-element List x2)) (changeElem (changeElem List x2 e1) x

我使用此函数交换列表中的两个元素:

(defun change-path (List)
    (setf len (list-length List))
    (setf x1 (random len))
    (setf x2 (random len))
    (setf e1 (get-n-element List x1))
    (setf e2 (get-n-element List x2))

    (changeElem (changeElem List x2 e1) x1 e2)
)
函数
get-n-element
工作正常,
change path
有时工作正常,但是当我传递一个列表列表示例时,它总是返回程序堆栈溢出,我可以做些什么来修复这个问题

(defun changeElem (List pos novo)
    (cond ((null List) nil)
        ((zerop (1- pos)) (cons novo (changeElem (rest List) (1- pos) novo)))
        (t (cons (first List) (changeElem (rest Lista) (1- pos) novo)))

    )
)

(defun get-n-element (Lista n)
    (cond ((zerop (1- n)) (first Lista))
        (t (get-n-element (rest Lista) (1- n)))
    )
)

堆栈溢出错误应包含有关问题的信息。可能它来自changeElem,但请发布缺少的定义。其次,在未声明的变量上使用setf(在本例中应该使用let*)。在这种情况下,未指定但常见的行为是变异(全局)符号值(例如x1、x2)。全局变量的副作用不是好的做法。如果您在changelem中也这样做了,并且它是递归的,那么您就递归地变异全局变量,这在可重入性方面可能是不好的。请添加更多详细信息。我编辑了这个问题,也发布了changeElem。我不使用任何其他变量。我尝试使用let,但它返回了一个错误,所以我改为setfOh。。。我很愚蠢。。。x1和x2应该是从1到len,在该代码中,它们是从0到len-1计算的,在函数get-n-element生成错误时,堆栈溢出错误应该包含有关问题的信息。可能它来自changeElem,但请发布缺少的定义。其次,在未声明的变量上使用setf(在本例中应该使用let*)。在这种情况下,未指定但常见的行为是变异(全局)符号值(例如x1、x2)。全局变量的副作用不是好的做法。如果您在changelem中也这样做了,并且它是递归的,那么您就递归地变异全局变量,这在可重入性方面可能是不好的。请添加更多详细信息。我编辑了这个问题,也发布了changeElem。我不使用任何其他变量。我尝试使用let,但它返回了一个错误,所以我改为setfOh。。。我很愚蠢。。。x1和x2应该是从1到len,在该代码上,它们是从0到len-1计算的,在函数get-n-element上生成错误