Czy istnieje funkcja Common Lisp, która zamieni dwa elementy na liście, uwzględniając ich indeksy i zwróci zmodyfikowaną listę?Zamiana elementów na liście Common Lisp
11
A
Odpowiedz
16
Można użyć rotatef
:
(rotatef (nth i lst) (nth j lst))
Oczywiście, lista indeksowanie może być kosztowne (kosztuje O (wielkość listy)), więc jeśli robisz to z jakąś regularnością, wolisz chcą używać tablicy:
(rotatef (aref arr i) (aref arr j))
4
chciałbym uniknąć indeksowania na liście dwukrotnie za pomocą nthcdr
dostać CDR komórki cons zawierającego pierwszy element, który chcesz zamienić, a następnie użyć elt
do g i pozostały element z podlisty. Oznacza to, że musisz tylko raz indeksować od początku listy.
(let ((list-tail (nthcdr i list)))
(rotatef (car list-tail)
(elt list-tail (- j i)))
list)
Przynajmniej z mojej perspektywy jest to wystarczająco uciążliwe, aby usprawiedliwić funkcję.
DAMN! SO musi coś zrobić z podświetlaniem składni. Myślałem, że to źle dla Pythona. – aaronasterling