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