2015-04-03 11:14:25 -04:00
|
|
|
# test native emitter can handle closures correctly
|
|
|
|
|
2023-02-01 03:08:41 -05:00
|
|
|
|
2015-04-03 11:14:25 -04:00
|
|
|
# basic closure
|
|
|
|
@micropython.native
|
|
|
|
def f():
|
|
|
|
x = 1
|
2021-03-15 09:57:36 -04:00
|
|
|
|
2015-04-03 11:14:25 -04:00
|
|
|
@micropython.native
|
|
|
|
def g():
|
|
|
|
nonlocal x
|
|
|
|
return x
|
2021-03-15 09:57:36 -04:00
|
|
|
|
2015-04-03 11:14:25 -04:00
|
|
|
return g
|
2021-03-15 09:57:36 -04:00
|
|
|
|
|
|
|
|
2015-04-03 11:14:25 -04:00
|
|
|
print(f()())
|
|
|
|
|
2023-02-01 03:08:41 -05:00
|
|
|
|
2015-04-03 11:14:25 -04:00
|
|
|
# closing over an argument
|
|
|
|
@micropython.native
|
|
|
|
def f(x):
|
|
|
|
@micropython.native
|
|
|
|
def g():
|
|
|
|
nonlocal x
|
|
|
|
return x
|
2021-03-15 09:57:36 -04:00
|
|
|
|
2015-04-03 11:14:25 -04:00
|
|
|
return g
|
2021-03-15 09:57:36 -04:00
|
|
|
|
|
|
|
|
2015-04-03 11:14:25 -04:00
|
|
|
print(f(2)())
|
|
|
|
|
2023-02-01 03:08:41 -05:00
|
|
|
|
2015-04-03 11:14:25 -04:00
|
|
|
# closing over an argument and a normal local
|
|
|
|
@micropython.native
|
|
|
|
def f(x):
|
|
|
|
y = 2 * x
|
2021-03-15 09:57:36 -04:00
|
|
|
|
2015-04-03 11:14:25 -04:00
|
|
|
@micropython.native
|
|
|
|
def g(z):
|
|
|
|
return x + y + z
|
2021-03-15 09:57:36 -04:00
|
|
|
|
2015-04-03 11:14:25 -04:00
|
|
|
return g
|
2021-03-15 09:57:36 -04:00
|
|
|
|
|
|
|
|
2015-04-03 11:14:25 -04:00
|
|
|
print(f(2)(3))
|