這裏的功能。 我創建了兩個列表,然後連接它們。
(defun my-rotate (length shift)
"Return a list of given LENGTH, rotated by SHIFT."
(nconc
(loop for i from (1+ shift) to (- length shift -2) collect i)
(loop for i from 1 to shift collect i)))
(my-rotate 7 2)
==> (3 4 5 6 7 1 2)
注意,因爲這兩個loop
我國農產品fresh名單,我用nconc
,而不是append
。
但是,如果要旋轉現有列表,你需要做別的事情:
(defun rotate-list (list shift)
"Rotate the given LIST by the specified SHIFT."
(let ((len (length list)))
(setq shift (mod shift len)) ; handle circular shifts
(append (nthcdr (- len shift) list)
(butlast list shift))))
(rotate-list '(1 2 3 4 5 6) 2)
==> (5 6 1 2 3 4)
(rotate-list '(1 2 3 4 5 6) 20)
==> (5 6 1 2 3 4) ; same because 20 = 2 mod 6
(rotate-list '(1 2 3 4 5 6) 0)
==> (1 2 3 4 5 6) ; unchanged
注意,原來的名單裏nthcdr
點,所以我們必須使用append
以避免修改論據。
還要注意的是,我們(在butlast
在nthcdr
各一次)掃描list
參數兩次。 如果你的列表很大,並且分析表明這個函數是瓶頸,那麼你可能需要用循環重寫這個(這種情況是不太可能的,我已經很浪費時間寫這篇文章了)。
來源
2017-02-19 23:44:49
sds
無論如何這是什麼?可能有更好的方法來實現你的總體目標。 – blambert