Implement sequence matching in extra/match.
parent
f77528fd3b
commit
f50821af6e
|
@ -65,3 +65,26 @@ MACRO: match-cond ( assoc -- )
|
||||||
-rot
|
-rot
|
||||||
match [ "Pattern does not match" throw ] unless*
|
match [ "Pattern does not match" throw ] unless*
|
||||||
[ replace-patterns ] bind ;
|
[ replace-patterns ] bind ;
|
||||||
|
|
||||||
|
: ?1-tail ( seq -- tail/f )
|
||||||
|
dup length zero? not [ 1 tail ] [ drop f ] if ;
|
||||||
|
|
||||||
|
: (match-first) ( seq pattern-seq -- bindings leftover/f )
|
||||||
|
2dup [ length ] 2apply < [ 2drop f f ]
|
||||||
|
[
|
||||||
|
2dup length head over match
|
||||||
|
[ nip swap ?1-tail ] [ >r 1 tail r> (match-first) ] if*
|
||||||
|
] if ;
|
||||||
|
|
||||||
|
: match-first ( seq pattern-seq -- bindings )
|
||||||
|
(match-first) drop ;
|
||||||
|
|
||||||
|
: (match-all) ( seq pattern-seq -- )
|
||||||
|
tuck (match-first) swap
|
||||||
|
[
|
||||||
|
, [ swap (match-all) ] [ drop ] if*
|
||||||
|
] [ 2drop ] if* ;
|
||||||
|
|
||||||
|
: match-all ( seq pattern-seq -- bindings-seq )
|
||||||
|
[ (match-all) ] { } make ;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue