2010-10-16 6 views

ответ

16

Вы можете использовать rotatef:

(rotatef (nth i lst) (nth j lst)) 

Конечно, список индексация может быть дорогой (стоимость O (размера списка)), так что если вы делаете это с любой регулярностью, вы бы скорее хотели использовать массив:

(rotatef (aref arr i) (aref arr j)) 
4

Я хотел бы избежать индексации в списке дважды, используя nthcdr, чтобы получить корд клетки конс, содержащей первый элемент, который вы хотите поменять, а затем использовать elt к г и оставшийся элемент из подсписок. Это означает, что вам нужно только индексировать, начиная с главы списка один раз.

(let ((list-tail (nthcdr i list))) 
    (rotatef (car list-tail) 
      (elt list-tail (- j i))) 
    list) 

По крайней мере, с моей точки зрения, это достаточно утомительно, чтобы оправдать функцию.

+6

DAMN! SO нужно что-то сделать для подсветки синтаксиса. Я думал, что это плохо для питона. – aaronasterling

Смежные вопросы