1import micropython
2
3# viper function taking and returning ints
4@micropython.viper
5def viper_int(x: int, y: int) -> int:
6    return x + y + 3
7
8
9print(viper_int(1, 2))
10
11# viper function taking and returning objects
12@micropython.viper
13def viper_object(x: object, y: object) -> object:
14    return x + y
15
16
17print(viper_object(1, 2))
18
19# return None as non-object (should return 0)
20@micropython.viper
21def viper_ret_none() -> int:
22    return None
23
24
25print(viper_ret_none())
26
27# return Ellipsis as object
28@micropython.viper
29def viper_ret_ellipsis() -> object:
30    return ...
31
32
33print(viper_ret_ellipsis())
34
35# 3 args
36@micropython.viper
37def viper_3args(a: int, b: int, c: int) -> int:
38    return a + b + c
39
40
41print(viper_3args(1, 2, 3))
42
43# 4 args
44@micropython.viper
45def viper_4args(a: int, b: int, c: int, d: int) -> int:
46    return a + b + c + d
47
48
49# viper call with 4 args not yet supported
50# print(viper_4args(1, 2, 3, 4))
51
52# a local (should have automatic type int)
53@micropython.viper
54def viper_local(x: int) -> int:
55    y = 4
56    return x + y
57
58
59print(viper_local(3))
60
61# without type annotation, types should default to object
62@micropython.viper
63def viper_no_annotation(x, y):
64    return x * y
65
66
67print(viper_no_annotation(4, 5))
68
69# a for loop
70@micropython.viper
71def viper_for(a: int, b: int) -> int:
72    total = 0
73    for x in range(a, b):
74        total += x
75    return total
76
77
78print(viper_for(10, 10000))
79
80# accessing a global
81@micropython.viper
82def viper_access_global():
83    global gl
84    gl = 1
85    return gl
86
87
88print(viper_access_global(), gl)
89
90# calling print with object and int types
91@micropython.viper
92def viper_print(x, y: int):
93    print(x, y + 1)
94
95
96viper_print(1, 2)
97
98# convert constants to objects in tuple
99@micropython.viper
100def viper_tuple_consts(x):
101    return (x, 1, False, True)
102
103
104print(viper_tuple_consts(0))
105
106# making a tuple from an object and an int
107@micropython.viper
108def viper_tuple(x, y: int):
109    return (x, y + 1)
110
111
112print(viper_tuple(1, 2))
113
114# making a list from an object and an int
115@micropython.viper
116def viper_list(x, y: int):
117    return [x, y + 1]
118
119
120print(viper_list(1, 2))
121
122# making a set from an object and an int
123@micropython.viper
124def viper_set(x, y: int):
125    return {x, y + 1}
126
127
128print(sorted(list(viper_set(1, 2))))
129
130# raising an exception
131@micropython.viper
132def viper_raise(x: int):
133    raise OSError(x)
134
135
136try:
137    viper_raise(1)
138except OSError as e:
139    print(repr(e))
140
141# calling GC after defining the function
142@micropython.viper
143def viper_gc() -> int:
144    return 1
145
146
147print(viper_gc())
148import gc
149
150gc.collect()
151print(viper_gc())
152