mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-19 19:10:17 +00:00
64 lines
908 B
Python
64 lines
908 B
Python
# only one level nested closure is implemented
|
|
|
|
def f0(a, b):
|
|
def f1():
|
|
return a + b
|
|
return f1
|
|
|
|
a = f0(1, 2)
|
|
b = f0(3, 4)
|
|
assert a() == 3
|
|
assert b() == 7
|
|
|
|
|
|
def f0(a, b):
|
|
def f1():
|
|
a = 5 # use this first
|
|
return a + b
|
|
return f1
|
|
|
|
a = f0(1, 2)
|
|
assert a() == 7
|
|
|
|
def f3(x, y):
|
|
return lambda z: x + y + z
|
|
|
|
a = f3(1, 2)
|
|
assert a(3) == 6
|
|
|
|
# closure ex
|
|
def f(n):
|
|
def g(x):
|
|
if x==n:
|
|
return n
|
|
return g(x+1)
|
|
return g(0)
|
|
|
|
assert f(10) == 10
|
|
|
|
# class closure
|
|
class A:
|
|
def g(self, x):
|
|
def f(y):
|
|
return x + y
|
|
return f
|
|
|
|
assert A().g(1)(2) == 3
|
|
|
|
# closure with yield
|
|
def g(x):
|
|
def fx(y):
|
|
yield x
|
|
yield y
|
|
return x + y
|
|
return fx
|
|
|
|
gen = g(1)(2)
|
|
assert next(gen) == 1
|
|
assert next(gen) == 2
|
|
try:
|
|
next(gen)
|
|
assert False
|
|
except StopIteration as e:
|
|
assert e.value == 3
|