気づかなかった手続きlist-tabulate(srfi-1)

連番的なリストを生成をする時、iotaとsrfi-42の手続きだけしか使っていなかった。
今までずっとlist-ec以外にiotaで表せない順序だったリストを生成する方法がないというのは変だと思っていたのだけれど。今日たまたまlist-tabulateを発見した。

(use srfi-42)
(define sq (lambda (x) (* x x)))

;;無駄なリストが生成される
(map sq (iota 5)) ; => (0 1 4 9 16)

;;いちいちsrfi-42をuseするのが面倒
(list-ec (: i 5) (* i i)) ; => (0 1 4 9 16)

;;欲しかったのはこれだよ
(list-tabulate 5 sq) ; => (0 1 4 9 16)

delete-duplicate

そういえばsrfi-1のdelete-duplicateも気づくのに時間がかかった。*1てっきり、uniqだとかuniqueだと勘違いしてしまう。

(define xs (list-tabulate 3 (cut list-tabulate <> identity)))
xs ; => (() (0) (0 1))
(delete-duplicates (apply append xs)) ; => (0 1)
(define uniq (with-module srfi-1 delete-duplicates))

あー

circular-listもあったのか-。

*1:発見してから手続きの名前を読んで意味を理解するの簡単なのだけれど