2010-10-16 13 views
11

İndeksleri verilen ve değiştirilen listeyi döndüren listedeki iki öğeyi değiştirecek bir Ortak Lisp işlevi var mı?Ortak Lisp listesinde yer değiştirme öğeleri

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

, liste indeksleme (listedeki) Ey (boyutu maliyet) pahalı olabilir, bu yüzden herhangi bir düzenlilik bunu yaparsan, yerine isterdim:

cevap

16

Sen rotatef kullanabilirsiniz

(rotatef (aref arr i) (aref arr j)) 
4
Ben elt için kullanmak daha sonra takas ve istediğiniz ilk elemanını içeren eksileri hücrenin cdr almak için nthcdr kullanarak listenin içine indeksleme iki kez önleyeceğini

gr: bir dizi kullanımı ve kalan öğeyi alt listeden çıkar. Bu, sadece bir kez listenin başından başlayarak dizine girmeniz gerektiği anlamına gelir.

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

En azından bakış açımdan, bu bir işlevi haklı çıkarmak için yeterince sıkıcı.

+6

DAMN! SO, sözdizimi vurgulaması hakkında bir şeyler yapmalıdır. Python için kötü olduğunu düşündüm. – aaronasterling