2012-02-05 21 views
1

是否可以告訴dolist從給定列表中的某個元素開始(或甚至更好)?因爲我可能不想評估所有元素。定義dolist的起點

如果沒有辦法這樣做,是否還有其他宏可以完成這項工作?

考慮這個例子:

(defvar *liste* #(1 2 3 4 5 6)) 

(dolist (x *liste* :start-after: '4) 
(FORMAT t "~a~%" x)) 

導致:

5 
6 
+0

您可能要接受一個答案,因爲這裏有兩個答案是解決你的問題。 – Marcin 2012-02-06 16:19:28

+0

想在給出解決方案虛假信用之前嘗試兩種方法。但事實上兩者都可以完成交易,第二個事實證明更容易和更好地修改。 – Sim 2012-02-07 11:23:34

回答

2

哪些Lisp的方言,我們談論的?

假設通用Lisp。

#(1 2 3 4 5 6)不是list。這是一個vector

CL-USER > (let ((v #(1 2 3 4 5 6))) 
      (loop for i from 4 below (length v) 
        do (print (aref v i)))) 

5 
6 
NIL 

與列表:

CL-USER 1 > (mapC#'print (nthcdr 4 '(1 2 3 4 5 6))) 

5 
6 
(5 6) 
2
+0

它確實做了它的工作,但我正在寫一個遞歸函數來創建一個列表的二項式係數(形成元素的所有組合),因此可以將doliste與':start-after'組合使用,這將緩解我工作了很多。 – Sim 2012-02-05 10:27:14

+0

沒錯,但是你可以從你從NTHCDR獲得的列表尾部開始。 – Marcin 2012-02-05 10:30:52

+3

你可以在同一個地點代替'* liste *:start-after 4'''(nthcdr 4 * liste *)',這實際上更短,否則就是相同的,因爲dolist無論如何不得不nthcdr找到一個起點。 – Ramarren 2012-02-05 10:33:44