1 |
# tea functions |
2 |
|
3 |
#### setvar f()[2] = 42 (setitem) |
4 |
shopt -s oil:all |
5 |
shopt -s parse_tea |
6 |
|
7 |
var mylist = [1,2,3] |
8 |
func f() { |
9 |
return mylist |
10 |
} |
11 |
setvar f()[2] = 42 |
12 |
write @mylist |
13 |
## STDOUT: |
14 |
1 |
15 |
2 |
16 |
42 |
17 |
## END |
18 |
|
19 |
#### Untyped func |
20 |
shopt -s oil:all |
21 |
shopt -s parse_tea |
22 |
|
23 |
func add(x, y) Int { |
24 |
echo 'hi' |
25 |
return x + y |
26 |
} |
27 |
var result = add(42, 1) |
28 |
echo $result |
29 |
## STDOUT: |
30 |
hi |
31 |
43 |
32 |
## END |
33 |
|
34 |
#### Typed func |
35 |
shopt -s oil:all |
36 |
shopt -s parse_tea |
37 |
|
38 |
func add(x Int, y Int) Int { |
39 |
echo 'hi' |
40 |
return x+y |
41 |
} |
42 |
var result = add(42, 1) |
43 |
echo $result |
44 |
## STDOUT: |
45 |
hi |
46 |
43 |
47 |
## END |
48 |
|
49 |
#### func: default values for positional params |
50 |
shopt -s oil:all |
51 |
shopt -s parse_tea |
52 |
|
53 |
func add(x Int, y=1, z=1+2*3) { |
54 |
return x + y + z |
55 |
} |
56 |
echo $add(3) |
57 |
echo $add(3,4) |
58 |
## STDOUT: |
59 |
11 |
60 |
14 |
61 |
## END |
62 |
|
63 |
#### pass too many positional params to func (without spread) |
64 |
shopt -s oil:all |
65 |
shopt -s parse_tea |
66 |
|
67 |
func add(x, y) { |
68 |
return x + y |
69 |
} |
70 |
var f = add(1,2) |
71 |
echo f=$f |
72 |
var f = add(1,2,3) |
73 |
echo $f |
74 |
## status: 1 |
75 |
## STDOUT: |
76 |
f=3 |
77 |
## END |
78 |
|
79 |
#### Positional Spread |
80 |
shopt -s oil:all |
81 |
shopt -s parse_tea |
82 |
|
83 |
func add(x, y, ...args) { |
84 |
pp cell ':args' # This works in Tea too for debugging |
85 |
return x + y |
86 |
} |
87 |
var args = %[5 6 7 8] |
88 |
var y = add(...args) |
89 |
echo y=$y |
90 |
## STDOUT: |
91 |
7 |
92 |
8 |
93 |
y=11 |
94 |
## END |
95 |
|
96 |
#### pass named arg to func |
97 |
shopt -s oil:all |
98 |
shopt -s parse_tea |
99 |
|
100 |
func f(; x=42) { |
101 |
echo $x |
102 |
} |
103 |
_ f() |
104 |
_ f(x=99) |
105 |
## STDOUT: |
106 |
42 |
107 |
99 |
108 |
## END |
109 |
|
110 |
#### Func with missing named param with no default |
111 |
shopt -s oil:all |
112 |
shopt -s parse_tea |
113 |
|
114 |
func add(x Int, y Int ; verbose Bool) { |
115 |
if (verbose) { |
116 |
echo 'verbose' |
117 |
} |
118 |
return x + y |
119 |
} |
120 |
var a = add(3, 2, verbose=true) |
121 |
echo $a |
122 |
|
123 |
# crashes |
124 |
var a = add(3, 2) |
125 |
echo "shouldn't get here" |
126 |
## status: 1 |
127 |
## STDOUT: |
128 |
verbose |
129 |
5 |
130 |
## END |
131 |
|
132 |
#### Func passed wrong named param |
133 |
shopt -s oil:all |
134 |
shopt -s parse_tea |
135 |
|
136 |
func add(x, y) { |
137 |
return x + y |
138 |
} |
139 |
var x = add(2, 3) |
140 |
echo x=$x |
141 |
var y = add(2, 3, verbose=true) |
142 |
|
143 |
## status: 1 |
144 |
## STDOUT: |
145 |
x=5 |
146 |
## END |
147 |
|
148 |
|
149 |
#### Named Spread |
150 |
shopt -s oil:all |
151 |
shopt -s parse_tea |
152 |
|
153 |
func add(x, y; verbose=true, ...named) { |
154 |
if (verbose) { echo 'verbose' } |
155 |
|
156 |
# Can list splatting work in tea? Maybe it should be |
157 |
# x = splice(named) |
158 |
# pp cell 'x' |
159 |
# Or just |
160 |
# = named |
161 |
# = splice(named) |
162 |
write @named | sort |
163 |
return x + y |
164 |
} |
165 |
var args = {verbose: false, a: 1, b: 2} |
166 |
var args2 = {f: 3} |
167 |
var ret = add(2, 3; ...args, ...args2) |
168 |
echo ret=$ret |
169 |
## STDOUT: |
170 |
a |
171 |
b |
172 |
f |
173 |
ret=5 |
174 |
## END |
175 |
|
176 |
#### Func with varargs |
177 |
shopt -s oil:all |
178 |
shopt -s parse_tea |
179 |
|
180 |
func printf(fmt, ...args) { |
181 |
= fmt |
182 |
# Should be a LIST |
183 |
= args |
184 |
} |
185 |
_ printf('foo', 'a', 42, null) |
186 |
|
187 |
## STDOUT: |
188 |
(Str) 'foo' |
189 |
(Tuple) ('a', 42, None) |
190 |
## END |
191 |
|
192 |
#### return expression then return builtin |
193 |
shopt -s parse_tea |
194 |
|
195 |
func f(x) { |
196 |
return x + 2*3 |
197 |
} |
198 |
# this goes in proc |
199 |
f() { |
200 |
local x=42 |
201 |
return $x |
202 |
} |
203 |
var x = f(36) |
204 |
echo x=$x |
205 |
f |
206 |
echo status=$? |
207 |
## STDOUT: |
208 |
x=42 |
209 |
status=42 |
210 |
## END |
211 |
|
212 |
#### inline function calls with spread, named args, etc. |
213 |
shopt -s oil:all |
214 |
|
215 |
func f(a, b=0, ...args; c, d=0, ...named) { |
216 |
write __ args: @args |
217 |
write __ named: |
218 |
write @named | sort |
219 |
if (named) { |
220 |
return [a, b, c, d] |
221 |
} else { |
222 |
return a + b + c + d |
223 |
} |
224 |
} |
225 |
var a = [42, 43] |
226 |
var n = %{x: 99, y: 100} |
227 |
|
228 |
echo ____ |
229 |
write string $f(0, 1, ...a, c=2, d=3) |
230 |
|
231 |
# Now get a list back |
232 |
echo ____ |
233 |
write array @f(5, 6, ...a, c=7, d=8; ...n) |
234 |
|
235 |
## STDOUT: |
236 |
____ |
237 |
__ |
238 |
args: |
239 |
42 |
240 |
43 |
241 |
__ |
242 |
named: |
243 |
|
244 |
string |
245 |
6 |
246 |
____ |
247 |
__ |
248 |
args: |
249 |
42 |
250 |
43 |
251 |
__ |
252 |
named: |
253 |
x |
254 |
y |
255 |
array |
256 |
5 |
257 |
6 |
258 |
7 |
259 |
8 |
260 |
## END |
261 |
|
262 |
#### basic lambda |
263 |
var f = |x| x+1 |
264 |
var y = f(0) |
265 |
echo $y |
266 |
echo $f(42) |
267 |
## STDOUT: |
268 |
1 |
269 |
43 |
270 |
## END |
271 |
|
272 |
#### Nested functions ??? Bug from Till. |
273 |
shopt -s oil:all |
274 |
shopt -s parse_tea |
275 |
|
276 |
# I think we should disallow these. |
277 |
# The bug is related to return as a keyword!!! Which we will get rid of in the |
278 |
# newer Tea parser. |
279 |
|
280 |
func returnsString() { |
281 |
func unrelated() {return "hm?"} |
282 |
return "test" # This fails |
283 |
} |
284 |
|
285 |
= returnsString() |
286 |
|
287 |
## STDOUT: |
288 |
## END |