2011年5月28日土曜日

リストの作成

F#のyieldやyield!っぽいなにかを書いてみました。値を集めることしかしませんが、 loopマクロよりもリストを作りやすいのではないか、という気はします。

(defmacro yielding (&body body)
(let ((gtail (gensym))
(ghead (gensym))
(garg (gensym))
(gtmp (gensym)))
`(let* ((,ghead (cons nil nil))
(,gtail ,ghead))
(macrolet
((yield (,garg) `(setf (cdr ,',gtail) (cons ,,garg nil)
,',gtail (cdr ,',gtail)))
(yield! (,garg) `(loop :for ,',gtmp :in ,,garg :do (yield ,',gtmp))))
,@body
(cdr ,ghead)))))

> (yielding (yield 2))
(2)
> (yielding (dotimes (i 3) (yield i)) (yield! (sort (list 1 2) #'>)))
(0 1 2 2 1)

0 件のコメント:

コメントを投稿