seriesと遅延評価

seriesで遅延評価されているか確認。
なんだかまたhaskellさわってみたくなってきた・・・。
前よりはわかること増えてるんじゃないかって思えるし。

; SLIME 2006-11-26
CL-USER> ;;seriesで遅延評価の確認
; No value
CL-USER> (require :series)
("SB-CLTL2" "SERIES")
CL-USER> (use-package :series)
T
CL-USER> (choose-if #'(lambda (x)
            (print x)
            (oddp x))
            (scan '(1 2 3 4 5)))

1 
2 
3 
4 
5 
#Z(1 3 5)
;;printで表示されちゃっている。遅延評価はされてるけどトップレベル戻り値をが評価しちゃってるからか?
;;無理矢理だけど評価されないようにしてみるとprintされなくなる
CL-USER> (progn
       (setf a (choose-if #'(lambda (x)
                  (print x)
                  (oddp x))
                  (scan '(1 2 3 4 5))))
       'end)
END
;;ここでaを評価すると・・・
CL-USER> a

1 
2 
3 
4 
5 
#Z(1 3 5)
;;lambdが遅延評価されてこの時点でprintされる