mirror of
https://github.com/janet-lang/janet
synced 2024-12-23 15:00:27 +00:00
Update match macro to test for array/tuples and table/structs.
This commit is contained in:
parent
b250679789
commit
bc8be266f5
@ -960,21 +960,28 @@ value, one key will be ignored."
|
|||||||
(do
|
(do
|
||||||
(def len (length pattern))
|
(def len (length pattern))
|
||||||
(var i -1)
|
(var i -1)
|
||||||
(with-idemp $arr expr
|
(with-idemp
|
||||||
((fn aux []
|
$arr expr
|
||||||
|
~(if (indexed? ,$arr)
|
||||||
|
,((fn aux []
|
||||||
(++ i)
|
(++ i)
|
||||||
(if (= i len)
|
(if (= i len)
|
||||||
(onmatch)
|
(onmatch)
|
||||||
(match-1 pattern.i ~(get ,$arr ,i) aux seen))))))
|
(match-1 pattern.i (tuple get $arr i) aux seen))))
|
||||||
|
,sentinel)))
|
||||||
|
|
||||||
(dictionary? pattern)
|
(dictionary? pattern)
|
||||||
(do
|
(do
|
||||||
(var key nil)
|
(var key nil)
|
||||||
(with-idemp $dict expr ((fn aux []
|
(with-idemp
|
||||||
|
$dict expr
|
||||||
|
~(if (dictionary? ,$dict)
|
||||||
|
,((fn aux []
|
||||||
(:= key (next pattern key))
|
(:= key (next pattern key))
|
||||||
(if (= key nil)
|
(if (= key nil)
|
||||||
(onmatch)
|
(onmatch)
|
||||||
(match-1 (get pattern key) ~(get ,$dict ,key) aux seen))))))
|
(match-1 (get pattern key) (tuple get $dict key) aux seen))))
|
||||||
|
,sentinel)))
|
||||||
|
|
||||||
:else ~(if (= ,pattern ,expr) ,(onmatch) ,sentinel)))
|
:else ~(if (= ,pattern ,expr) ,(onmatch) ,sentinel)))
|
||||||
|
|
||||||
|
@ -25,4 +25,25 @@
|
|||||||
(assert (= (length (range 1 10)) 9) "(range 1 10)")
|
(assert (= (length (range 1 10)) 9) "(range 1 10)")
|
||||||
(assert (deep= @{:a 1 :b 2 :c 3} (zipcoll '[:a :b :c] '[1 2 3])) "zipcoll")
|
(assert (deep= @{:a 1 :b 2 :c 3} (zipcoll '[:a :b :c] '[1 2 3])) "zipcoll")
|
||||||
|
|
||||||
|
(def- a 100)
|
||||||
|
(assert (= a 100) "def-")
|
||||||
|
|
||||||
|
(assert (= :first
|
||||||
|
(match @[1 3 5]
|
||||||
|
@[x y z] :first
|
||||||
|
:second)) "match 1")
|
||||||
|
|
||||||
|
(def val1 :avalue)
|
||||||
|
(assert (= :second
|
||||||
|
(match val1
|
||||||
|
@[x y z] :first
|
||||||
|
:avalue :second
|
||||||
|
:third)) "match 2")
|
||||||
|
|
||||||
|
(assert (= 100
|
||||||
|
(match @[50 40]
|
||||||
|
@[x x] (* x 3)
|
||||||
|
@[x y] (+ x y 10)
|
||||||
|
0)) "match 3")
|
||||||
|
|
||||||
(end-suite)
|
(end-suite)
|
||||||
|
Loading…
Reference in New Issue
Block a user