поменяйте местами элементы между двумя списками в LISP - PullRequest
0 голосов
/ 06 июля 2018

спасибо за вашу поддержку, я новичок ... Я хотел бы поменять местами элементы между двумя списками в Common-LISP с определенным индексом первого и второго списка, например: (1 2 3 4) (A B C D) -> (D 2 3 4), когда указанными индексами являются (0 3).

Может выглядеть случайным образом, но в музыкальных эпизодах есть хорошая полезность ... Спасибо, Alessandro

1 Ответ

0 голосов
/ 06 июля 2018

Если вам нужно использовать индекс, возможно, вектор может быть более разумным. Например, используйте 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)

Если вы действительно хотите использовать списки, тогда используйте 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
; 
...