是否可以告訴dolist
從給定列表中的某個元素開始(或甚至更好)?因爲我可能不想評估所有元素。定義dolist的起點
如果沒有辦法這樣做,是否還有其他宏可以完成這項工作?
考慮這個例子:
(defvar *liste* #(1 2 3 4 5 6))
(dolist (x *liste* :start-after: '4)
(FORMAT t "~a~%" x))
導致:
5
6
是否可以告訴dolist
從給定列表中的某個元素開始(或甚至更好)?因爲我可能不想評估所有元素。定義dolist的起點
如果沒有辦法這樣做,是否還有其他宏可以完成這項工作?
考慮這個例子:
(defvar *liste* #(1 2 3 4 5 6))
(dolist (x *liste* :start-after: '4)
(FORMAT t "~a~%" x))
導致:
5
6
哪些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)
它確實做了它的工作,但我正在寫一個遞歸函數來創建一個列表的二項式係數(形成元素的所有組合),因此可以將doliste與':start-after'組合使用,這將緩解我工作了很多。 – Sim 2012-02-05 10:27:14
沒錯,但是你可以從你從NTHCDR獲得的列表尾部開始。 – Marcin 2012-02-05 10:30:52
你可以在同一個地點代替'* liste *:start-after 4'''(nthcdr 4 * liste *)',這實際上更短,否則就是相同的,因爲dolist無論如何不得不nthcdr找到一個起點。 – Ramarren 2012-02-05 10:33:44
您可能要接受一個答案,因爲這裏有兩個答案是解決你的問題。 – Marcin 2012-02-06 16:19:28
想在給出解決方案虛假信用之前嘗試兩種方法。但事實上兩者都可以完成交易,第二個事實證明更容易和更好地修改。 – Sim 2012-02-07 11:23:34