在LISP中交换两个列表之间的元素

Ale*_*oci 2 swap common-lisp

感谢您的支持,我是新手...我想在第一和第二个列表的某个索引中交换两个列表在Common-LISP中的元素,例如:(1 2 3 4)(ABCD) - > (D 2 3 4)当指定的索引是(0 3)时.

它可能看起来随机,但它在音乐序列中有很好的效用......谢谢,亚历山德罗

cor*_*ump 6

如果你需要使用索引,也许矢量可能更明智.例如ROTATEF,使用jkiiski解释:

CL-USER> (let ((a (vector 1 2 3 4))
               (b (vector 'a 'b 'c 'd)))
           (rotatef (aref a 0) (aref b 3))
           (values a b))
#(D 2 3 4)
#(A B C 1)
Run Code Online (Sandbox Code Playgroud)

如果你真的想使用列表,那么使用NTH或者ELT可以使用两种序列.

抢先注意:您无法修改常量数据.注意如何载体a,并b在运行时进行分配.常量数据是在读取时或编译时计算的数据,不应在运行时修改.引用列表是常量,如此示例所示:

CL-USER> (let ((list '(a b))) (setf (first list) 0) list)
; in: LET ((LIST '(A B)))
;     (SETF (FIRST LIST) 0)
; ==>
;   (SB-KERNEL:%RPLACA LIST 0)
; 
; caught WARNING:
;   Destructive function SB-KERNEL:%RPLACA called on constant data: (A B).
;   See also:
;     The ANSI Standard, Special Operator QUOTE
;     The ANSI Standard, Section 3.2.2.3
; 
Run Code Online (Sandbox Code Playgroud)