ボディが無限リスト — #:g1

Posted 2011-09-13 14:00:00 GMT

最初見たときは、いやー無理だろうと思ったけど評価を遅延させればできなくもないかも。でもこれじゃ面白くないのかも

(defmacro circularize (&rest forms)
  `(srfi-1:circular-list
    (lambda ()
      ,@forms)))

(loop :repeat 100 :for j :in (let ((a 0)) (circularize (format t "~D " a) (incf a))) :do (funcall j)) ;-> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 ;=> NIL

@g000001 こういうのもありかも

(block nil
  (let ((a 0))
    (map nil #'funcall
         (circularize
          (when (> a 100) (return))
          (format t "~D " a)
          (incf a)))))


HTML generated by 3bmd in LispWorks 7.0.0

comments powered by Disqus