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