在LISP

时间:2018-07-06 09:39:20

标签: common-lisp swap

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

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

1 个答案:

答案 0 :(得分:6)

如果需要使用索引,则向量可能更明智。如jkiiski所述,例如使用ROTATEF

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)

如果您确实要使用列表,请使用NTHELT,它们对两种序列都适用。

抢先注:您不能修改常量数据。请注意,向量ab在运行时是如何分配的。常量数据是在读取时或编译时计算的数据,不应在运行时进行修改。引用列表是恒定的,如以下示例所示:

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
;