読者です 読者をやめる 読者になる 読者になる

きくらげ観察日記

好きなことを、適当に。

Gaucheでリスト内包表記

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-**とかいうモジュール名、覚えにくすぎませんか……?なんとかならないもんですかね……。)