GitHub

UtilMatch

patvar ;; すべて、かつ、パターン変数を束縛

(match 3 (x (+ x 1))) ;-> 4

以下のシンボルは特別な意味をもち、パターン変数としては使えません。 _、quote、$、struct、@、object、 =、and、or、not、?、set!、 get!、backquote、...、___ および ..k と __k (ここで、k は整数)。

_ ;; すべて

(match '(1 2 3) (_ "hoge")) ;-> "hoge"

() ;; 空リスト

(match '() (() 1)) ;-> 1

#t ;; #t

(match #t (#t 1)) ;-> 1

#f ;; #f

(match #f (#f 1)) ;-> 1

string ;; 文字列

(match "foo" ("foo" 1) ("bar" 2)) ;-> 1

number ;; 数

character ;; 文字

keyword ;; キーワード (*)

'sexp ;; S式

(match '(1 2 3) ('(1 2 3) "foo")) ;-> "foo"

'symbol ;; シンボル(S式の特殊ケース)

(match 'a ('a "foo")) ;-> "foo"

(pat1 ... patN) ;; n 要素のリスト

(match '(1 2)   ((_ _) 1) (else #f)) ;-> 1
(match '(1 2 3) ((_ _) 1) (else #f)) ;-> #f

(pat1 ... patN . patN+1) ;; n 以上の要素を含むリスト

(match '(1)     ((a b . c) c) (else #f)) ;-> #f
(match '(1 2)   ((a b . c) c) (else #f)) ;-> ()
(match '(1 2 3) ((a b . c) c) (else #f)) ;-> (3)
    (pat1 ... patN patN+1 ooo)   ;; n 以上の要素を含むリスト、残りの各要素は
                                  ;; patN+1 にマッチしなければならない
    #(pat1 ... patN)             ;; n 要素のベクタ
    #(pat1 ... patN patN+1 ooo)  ;; n 以上の要素を含むベクタ、残りの各要素は
                                  ;; patN+1 にマッチしなければならない
   | ($ class pat1 ... patN)      ;; オブジェクト (patK はスロット順でマッチ)
   | (struct class pat1 ... patN) ;; 同上 (*)
   | (@ class (slot1 pat1) ...)  ;; オブジェクト (スロット名を使う) (*)
   | (object class (slot1 pat1) ...) ;; 同上 (*)

(= proc pat) ;; procを適用し、結果を pat にマッチさせる

(match '(1 2 3) ((= car 1) #t)) ;-> #t
   | (and pat ...)                ;; すべての pat にマッチするか
   | (or pat ...)                 ;; マッチする pat があるか
   | (not pat ...)                ;; どの pat もマッチしないか

(? predicate pat ...) ;; predicate が真、かつ、全 pat がマッチ

(match '(4 "foo") ((? list? _ _) #t)) ;-> #t
(match '(4 "foo") ((= car (? (pa$ < 2) _ )) #t)) ;-> #t
   | (set! patvar)                ;; すべて、かつ、セッタを束縛
   | (get! patvar)                ;; すべて、かつ、ゲッタを束縛
   | `qp                          ;; 擬似パターン

patvar : a symbol except _, quote, $, struct, @, object, =, and, or,

        not, ?, set!, get!, backquote, ..., ___, ..k, __k.

ooo : ... ;; ゼロまたはそれ以上

   | ___                          ;; ゼロまたはそれ以上
   | ..k                          ;; k またはそれ以上
   | __k                          ;; k またはそれ以上
source: UtilMatch.hd
View on github | Report issue