1# mode: run
2# tag: lambda
3# ticket: 195
4
5__doc__ = u"""
6#>>> py_identity = lambda x:x
7#>>> py_identity(1) == cy_identity(1)
8#True
9"""
10
11#cy_identity = lambda x:x
12
13
14def make_identity():
15    """
16    >>> idcall = make_identity()
17    >>> idcall(1)
18    1
19    >>> idcall(2)
20    2
21    """
22    return lambda x:x
23
24def make_const0(x):
25    """
26    >>> make_const0(1)()
27    1
28    """
29    return lambda :x
30
31def make_const1(x):
32    """
33    >>> make_const1(1)(2)
34    1
35    >>> make_const1(1)(2)
36    1
37    """
38    return lambda _:x
39
40
41def make_const_calc0():
42    """
43    >>> make_const_calc0()()
44    11
45    """
46    return lambda : 1*2*3+5
47
48def make_const_calc1():
49    """
50    >>> make_const_calc1()(2)
51    11
52    """
53    return lambda _: 1*2*3+5
54
55def make_const_calc1_xy(x):
56    """
57    >>> make_const_calc1_xy(8)(2)
58    27
59    """
60    return lambda y: x*y+(1*2*3+5)
61
62def make_lambda_lambda(x):
63    """
64    >>> make_lambda_lambda(1)(2)(4)
65    7
66    """
67    return lambda y : \
68           lambda z:x+y+z
69
70def make_typed_lambda_lambda(int x):
71    """
72    >>> make_typed_lambda_lambda(1)(2)(4)
73    7
74
75    >>> partial_lambda = make_typed_lambda_lambda(1)(2)
76    >>> partial_lambda(4)
77    7
78    >>> partial_lambda(5)
79    8
80    """
81    return lambda int y : \
82           lambda int z:x+y+z
83
84def pass_lambda(f):
85    """
86    >>> def f(a, lfunc): return lfunc(a,2)
87    >>> pass_lambda(f)
88    12
89    """
90    return f(1, lambda a, b : a*10+b)
91
92def pass_lambda_with_args(f):
93    """
94    >>> def f(a, lfunc): return lfunc(a,2,3)
95    >>> pass_lambda_with_args(f)
96    123
97    """
98    return f(1, lambda a, *args : (a*10 + args[0])*10 + args[1])
99
100def pass_lambda_with_args_kwargs(f):
101    """
102    >>> def f(a, lfunc): return lfunc(a,2,3, b=4)
103    >>> pass_lambda_with_args_kwargs(f)
104    1234
105    """
106    return f(1, lambda a, *args, **kwargs : ((a*10 + args[0])*10 + args[1])*10 + kwargs['b'])
107
108def pass_lambda_with_args_kwargs_kwonly_args(f):
109    """
110    >>> def f(a, lfunc): return lfunc(a,2,3, b=4, c=5)
111    >>> pass_lambda_with_args_kwargs_kwonly_args(f)
112    12345
113    """
114    return f(1, lambda a, *args, b, **kwargs : (((a*10 + args[0])*10 + args[1])*10 + b)*10 + kwargs['c'])
115