srfi-42には、リスト内包表記に関するマクロが定義されています。
(use srfi-42) ;; Haskellでいう ;; [i * 2 | i <- [0, 1, 2, 3, 4]] (list-ec (: i '(0 1 2 3 4)) (* i 2)) ; => (0 2 4 6 8) ;; iの値の範囲の指定もできる (list-ec (: i 0 5) (* i 2)) ; => (0 2 4 6 8)
また、複数のリストを指定することもできます。
(list-ec (: i 0 5) (: j 0 3) `(,i . ,j)) ;; => ((0 . 0) (0 . 1) (0 . 2) (1 . 0) (1 . 1) ;; (1 . 2) (2 . 0) (2 . 1) (2 . 2) (3 . 0) ;; (3 . 1) (3 . 2) (4 . 0) (4 . 1) (4 . 2))
フィルタリングは、(if pred)もしくは(not pred)で行うことができます。
(list-ec (: i 10) (if (odd? i)) i) ; => (1 3 5 7 9) (list-ec (: i 10) (not (odd? i)) i) ; => (0 2 4 6 8)
また、複数のリストをzipしたい場合は、:parallelを使用します。
(list-ec (:parallel (: i 1 5) (: j 11 15)) (+ i j)) ;; => (12 14 16 18)
その他にも、vector内包表記であるvector-ecや、文字列内包表記であるstring-ecなども定義されています。
(余談ですが、このsrfi-**とかいうモジュール名、覚えにくすぎませんか……?なんとかならないもんですかね……。)