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