OILS / spec / ysh-closures.test.sh View on Github | oils.pub

180 lines, 98 significant
1## oils_failures_allowed: 0
2
3#### Simple Expr Closure
4shopt --set ysh:upgrade
5
6proc my-expr (; expr) {
7 echo $[io->evalExpr(expr)]
8}
9
10proc p {
11 var i = 42
12 my-expr [i + 1]
13}
14
15p
16
17## STDOUT:
1843
19## END
20
21#### Simple Block Closure
22shopt --set ysh:upgrade
23
24shopt --set ysh:upgrade
25
26proc my-expr (; ; ; block) {
27 call io->eval(block)
28}
29
30proc p {
31 var i = 42
32 my-expr {
33 echo $[i + 1]
34 }
35}
36
37p
38
39## STDOUT:
4043
41## END
42
43#### Expr Closures in a Loop !
44
45# see demo/survey-closure.sh
46
47shopt --set ysh:upgrade
48
49proc task (; tasks, expr) {
50 call tasks->append(expr)
51}
52
53func makeTasks() {
54 var tasks = []
55 var x = 'x'
56 for i in (0 ..< 3) {
57 var j = i + 2
58 task (tasks, ^"$x: i = $i, j = $j")
59 }
60 return (tasks)
61}
62
63var exprs = makeTasks()
64#= blocks
65
66for ex in (exprs) {
67 var s = io->evalExpr(ex)
68 echo $s
69}
70
71## STDOUT:
72x: i = 0, j = 2
73x: i = 1, j = 3
74x: i = 2, j = 4
75## END
76
77#### Block Closures in a Loop !
78shopt --set ysh:upgrade
79
80proc task (; tasks; ; b) {
81 call tasks->append(b)
82}
83
84func makeTasks() {
85 var tasks = []
86 var x = 'x'
87 for i in (0 ..< 3) {
88 var j = i + 2
89 task (tasks) { echo "$x: i = $i, j = $j" }
90 }
91 return (tasks)
92}
93
94var blocks = makeTasks()
95#= blocks
96
97for b in (blocks) {
98 call io->eval(b)
99}
100
101## STDOUT:
102x: i = 0, j = 2
103x: i = 1, j = 3
104x: i = 2, j = 4
105## END
106
107
108#### Explicit __invoke__ for "objects in a loop", not closures in a loop
109shopt --set ysh:upgrade
110
111var procs = []
112for i in (0 ..< 3) {
113 proc __invoke__ (; self) {
114 echo "i = $[self.i]"
115 }
116 var methods = Object(null, {__invoke__})
117 var obj = Object(methods, {i})
118 call procs->append(obj)
119}
120
121for p in (procs) {
122 p
123}
124
125# TODO: sugar
126# proc p (; self) capture {i} {
127# echo "i = $[self.i]"
128# }
129# call procs->append(p)
130
131## STDOUT:
132i = 0
133i = 1
134i = 2
135## END
136
137
138#### Expr Closures in a different module
139shopt --set ysh:upgrade
140
141use $REPO_ROOT/spec/testdata/module2/closure.ysh --pick {local,global}_expr
142
143echo $[io->evalExpr(global_expr)]
144
145echo $[io->evalExpr(local_expr())]
146
147## STDOUT:
148global!
149global local!
150## END
151
152
153#### Command Closures in a different module
154shopt --set ysh:upgrade
155
156use $REPO_ROOT/spec/testdata/module2/closure.ysh --pick {local,global}_block
157
158call io->eval(global_block)
159
160call io->eval(local_block())
161
162## STDOUT:
163global!
164global local!
165## END
166
167#### Closures as default argument
168shopt --set ysh:upgrade
169
170use $REPO_ROOT/spec/testdata/module2/closure.ysh --pick default_{expr,block}
171
172echo $[io->evalExpr(default_expr())]
173
174call io->eval(default_block())
175
176## STDOUT:
177global expr!
178global block!
179## END
180