lispとrubyとpythonと その3 リスト(lisp series-collectors)

Lisp、series-collectors編
Collectorsはseriesをはずして中身を取り出す

;; COLLECT-FIRST ITEMS &optional (DEFAULT NIL)                      [Function]
;; これは単純。
;; 最初の要素取り出し
(collect-first (scan-range))
;;出力
;;0

(collect-first #z())
;;出力
;;NIL
;;要素が空だった時のデフォルト値を指定できる
(series:collect-first #z() 'a)
;;出力
;;A

;; COLLECT-LAST ITEMS &optional (DEFAULT NIL)                       [Function]
;;最終要素の取り出し
(collect-last (subseries (scan-range) 0 10))
;;出力
;;9

;; COLLECT-NTH N ITEMS &optional (DEFAULT NIL)                      [Function]
;; n番目の要素の取り出し
(series:collect-nth 3 (scan-range))
;;出力
;;3

;; COLLECT-LENGTH ITEMS                                             [Function]
;; seriesの長さを取得
(collect-length (subseries (scan-range) 0 10))

;;出力
;;10

;; COLLECT-SUM NUMBERS &optional (TYPE 'NUMBER)                     [Function]
;; 合計値取得
(collect-sum (subseries (scan-range) 0 10))
;; 出力
;; 45

;; COLLECT-MAX NUMBERS                                              [Function]
;; 最大値取得
(collect-max #z(1 3 4 5 2 2))
;;出力
;;5

;; COLLECT-MIN NUMBERS                                              [Function]
;; 最小値取得
(collect-min #z(1 3 4 5 2 2))
;;出力
;;1

;; COLLECT-AND BOOLS                                                [Function]
;; seriesの要素をAndする
;; 一つでもnilがあったら結果はnil
;; そうじゃなければ最後の非nil要素を返す
(collect-and #z(1 2 3 4 nil 5))
;;NIL
(collect-and #z(1 2 3 4  5))
;;5

;; COLLECT-OR BOOLS                                                 [Function]
;; seriesの要素をorする
;; 非nilがあったら最初の非nil要素を返す
;; そうじゃなければnil
(collect-or #z(nil nil 1 2 nil nil))
;;1

(collect-or #z(nil nil nil nil nil nil))
;;NIL

;; COLLECT ITEMS                                                    [Function]
;; seriesの中身をシーケンスで取り出す
;;デフォルトではリストが返る
(collect #z(a b c))
;;(A B C)

;; COLLECT TYPE ITEMS                                               [Function]
(collect 'vector #z(a b c))
;;指定すればVectorでも返せる
;;#(A B C)

;; COLLECT-APPEND SEQUENCES                                         [Function]
;; seriesの要素をappendしてシーケンスで返す
;; デフォルトはリスト
(collect-append #z((1 2 3) (4 5)))
;;(1 2 3 4 5)

;; COLLECT-APPEND TYPE SEQUENCES                                    [Function]
;; collectと一緒でTypeを指定できる
(collect-append 'vector #z((1 2 3) (4 5)))
;;#(1 2 3 4 5)
(collect-append 'string #z("hello" " " "world"))
;;"hello world"

;; COLLECT-NCONC LISTS                                              [Function]
;; seriesの要素をnconcしてシーケンスで返す
;; collect-appendと大体同じ。
;; ただしこちらはかならずseriesのリストを受け取ってリストを返す
(collect-nconc #z((1 2 3) (4 5)))
;;(1 2 3 4 5)

;; COLLECT-ALIST KEYS VALUES                                        [Function]
;; keys、valuesのseriesからalistを作って返す
(collect-alist #z(1 2 3) #z(a b c))
;;((3 . C) (2 . B) (1 . A))

;; COLLECT-PLIST KEYS VALUES                                        [Function]
;; keys、valuesのseriesからplistを作って返す
(collect-plist #z(1 2 3) #z(a b c))
;;(3 C 2 B 1 A)

;; COLLECT-HASH KEYS VALUES &key :TEST :SIZE :REHASH-SIZE           [Function]
;; keys、valuesのseriesからhashtableを作って返す
(setf ht (collect-hash #z(1 2 3) #z(a b c) :test #'eq))
;; #
;; (gethash 1 ht)
;; A
;; T
;; (gethash 2 ht)
;; B
;; T

;; COLLECT-FILE FILE-NAME ITEMS &optional (PRINTER #'PRINT)         [Function]
;; seriesの内容をファイルに吐き出す
;; デバッグ用。。。なのかなぁ。
;; 出力の形式はoptional引数で指定できる
;; デフォルトはprintで、その他にPRIN1、PRINC、PPRINT、WRITE-CHAR、WRITE-STRING、WRITE-LINEなんかがいける
;; FILE-NAMEのファイルが既に存在するときはエラー
(collect-file "collect.test.tmp" #z(a b c d e))

;; COLLECT-FN TYPE INIT FUNCTION &rest SERIES-INPUTS                [Function]
;;collectの基本機能
;;initに初期値を返す関数
;;seriesのreduce
(collect-fn T 
       #'(lambda () ())
       #'(lambda (a b) 
    (append a (list b)))
       #z(a b c))
;;(A B C)

;;sum
(collect-fn T
       #'(lambda () 0)
       #'(lambda (a b)
    (+ a b))
       #z(1 2 3 4 5))
;;15