File: pattern.liq

package info (click to toggle)
liquidsoap 2.1.3-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 12,924 kB
  • sloc: ml: 73,577; javascript: 24,836; sh: 3,440; makefile: 764; xml: 114; ansic: 96; lisp: 62; python: 35; perl: 8; ruby: 8
file content (105 lines) | stat: -rwxr-xr-x 1,819 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#!../../src/liquidsoap ../../libs/stdlib.liq

%include "test.liq"

def c(x, y) =
  if x != y then
    print("#{x} != #{y}")
    test.fail()
  end
end

def f() =
  # Tuples
  let tuple = (123, "aabbcc", true, {foo=1})
  let (x, y, z, t) = tuple
  c(x, 123)
  c(y, "aabbcc")
  c(z, true)
  c(t, {foo=1})

  # List
  let l =  [1, 2, 3, 4, 5, 6, 7, 8, 9]
  let [x, y, ...z, t, u, v] = l
  c(x, 1)
  c(y, 2)
  c(z, [3, 4, 5, 6])
  c(t, 7)
  c(u, 8)
  c(v, 9)

  let [x,y] = [1,2,3]
  c(x, 1)
  c(y, 2)

  let [..._,x,y] = [1,2,3]
  c(x, 2)
  c(y, 3)

  let [...,x,y] = [1,2,3]
  c(x, 2)
  c(y, 3)

  let [x,_,...z] = [1,2,3]
  c(x, 1)
  c(z, [3])

  # Record
  record = {foo=123, gni="gno", bla=3.24}
  let {foo, gni, bla} = record
  c(foo, 123)
  c(gni, "gno")
  c(bla, 3.24)

  # Values with methods
  record = 123.{foo=123, gni="gno", bla=3.24}
  let v.{foo, gni, bla} = record
  c(v, 123)
  c(foo, 123)
  c(gni, "gno")
  c(bla, 3.24)

  record = 123.{foo=321, gni="gnu", bla=4.12}
  let _.{foo, gni, bla} = record
  c(foo, 321)
  c(gni, "gnu")
  c(bla, 4.12)

  # Combined patterns
  # Patterns inside records
  record' = {foo=tuple, gni=l, r=record}
  let {foo = (x,y,z,t), gni=[a,b,...s,d], r=v.{gni}} = record'
  c(foo, tuple)
  c(x, 123)
  c(y, "aabbcc")
  c(z, true)
  c(t, {foo=1})
  c(a, 1)
  c(b, 2)
  c(s, [3, 4, 5, 6, 7, 8])
  c(d, 9)
  c(r, record)
  c(v, 123)
  c(gni, "gnu")

  x = {foo=123, gni="gno", bla=3.24}
  y = {foo=123, gni="gnu", bla=3.24}
  z = {foo=123, gni="gno", bla=3.24}
  t = {foo=123, gni="gno", bla=4.24}
  l = [x, y, z, t]

  let [{foo}, {gni}, ..._, {bla}] = l
  c(foo, 123)
  c(gni, "gnu")
  c(bla, 4.24)

  let ({foo = [{foo}, {gni}, ..._, {bla}]}, z) = ({foo = l}, "the letter z")
  c(foo, 123)
  c(gni, "gnu")
  c(bla, 4.24)
  c(z, "the letter z")

  test.pass()
end

test.check(f)