-{extension 'match'} WIDTH = 50 function p(msg) io.write(msg, ' ':rep(WIDTH-#msg)) io.flush() end p "Basic match" match 1 with 1 -> print 'ok' end p "Sequence match" match 3, 4 with | 1, 2 -> print 'KO' | 3, 4 -> print 'ok' end p "Id binding" match 3, 4 with | 1, 2 -> print 'KO' | x, y -> print 'ok' end p "Table destructuring & non-litteral tested term" match {1, 2} with |{a, 2} -> assert(a==1); print 'ok' end p "Pattern group" match {'?'} with |1|2|3 -> print 'KO' |{...} -> print 'ok' end p "Multi-level destructuring" match {{1000}} with |{{2000}} -> print 'KO' |{{3000}} -> print 'KO' |{{1000}} -> print 'ok' end p "Guard" match 1 with | 1 if false -> print 'KO' | 1 -> print 'ok' end p "Guard with bound var" match 1 with | a if a ~= 1 -> print 'KO' | a if a == 1 -> print 'ok' end p "Non linear var & destructuring" match {1, {2}} with | {a, {a}} -> print 'KO' | {a, {b}} -> print 'ok' end p "Non-linear vars on a sequence" match 1, 2 with | a, a -> print 'KO' | a, b -> print 'ok' end p "Multiple _ wildcards" match 1, 2 with | _, _ -> print 'ok' | a, b -> print 'KO' end p "Regexp & non-linear vars" match 'toto' with | 't(.)t(.)' / { a, a } -> print (a..'k') end p "Nested match & ..." match { { 'o', 'k', '!' } } with | { t } -> match t with | { a, b } -> print 'KO' | { a, b, ... } -> print (a..b) | _ -> print 'KO' end | _ -> print 'KO' end