1 | #!/usr/bin/env bash
|
2 | #
|
3 | # Survey loop behavior - mutating the container while iterating over it
|
4 | #
|
5 | # List - Python and JS are consistent
|
6 | # Dict - Python and JS are different - Python 3 introduced version number check
|
7 | # JS and Python 2 may have "unknown" results
|
8 | #
|
9 | # Usage:
|
10 | # demo/survey-loop.sh <function name>
|
11 |
|
12 | set -o nounset
|
13 | set -o pipefail
|
14 | set -o errexit
|
15 |
|
16 | source build/dev-shell.sh # python3 in $PATH
|
17 |
|
18 | mutate-py() {
|
19 | echo ---
|
20 | echo PY
|
21 |
|
22 | python3 -c '
|
23 | mylist = [1,2,3]
|
24 | for x in mylist:
|
25 | if x == 2:
|
26 | mylist.append(99)
|
27 | print(x)
|
28 | '
|
29 |
|
30 | echo ---
|
31 | echo PY REMOVE
|
32 |
|
33 | # Hm doesn't print 3
|
34 | python3 -c '
|
35 | mylist = [1,2,3,4]
|
36 | for x in mylist:
|
37 | if x == 2:
|
38 | # skips one iteration
|
39 | mylist.remove(1)
|
40 | #mylist.pop()
|
41 | print(x)
|
42 | '
|
43 |
|
44 | echo ---
|
45 | echo PY DICT
|
46 |
|
47 | if false; then
|
48 | # dict size changed during iteration!!
|
49 | python3 -c '
|
50 | mydict = {1: None, 2: None, 3: None}
|
51 | for x in mydict:
|
52 | if x == 2:
|
53 | mydict[99] = None
|
54 | print(x)
|
55 | '
|
56 | fi
|
57 |
|
58 | echo ---
|
59 | echo PY comp
|
60 |
|
61 | python3 -c '
|
62 | def myappend(li, i):
|
63 | if i == 1:
|
64 | li.append(99)
|
65 | print(i)
|
66 | return i
|
67 |
|
68 | mylist = [1,2,3]
|
69 | y = [myappend(mylist, i) for i in mylist]
|
70 | print(y)
|
71 | '
|
72 | }
|
73 |
|
74 | mutate-js() {
|
75 | echo ---
|
76 | echo 'JS let'
|
77 |
|
78 | nodejs -e '
|
79 | let mylist = [1,2,3]
|
80 | for (let x of mylist) {
|
81 | if (x === 2) {
|
82 | mylist.push(99)
|
83 | }
|
84 | console.log(x)
|
85 | }
|
86 | '
|
87 |
|
88 | echo ---
|
89 | echo 'JS remove'
|
90 |
|
91 | nodejs -e '
|
92 | let mylist = [1,2,3,4]
|
93 | for (let x of mylist) {
|
94 | if (x === 2) {
|
95 | mylist.shift() // remove first item
|
96 | // mylist.pop() // remove last item
|
97 | }
|
98 | console.log(x)
|
99 | }
|
100 | '
|
101 |
|
102 | echo ---
|
103 | echo 'JS ADD OBJ'
|
104 |
|
105 | nodejs -e '
|
106 | let myobj = {"1": null, "2": null, "3": null}
|
107 | for (let x in myobj) {
|
108 | if (x === "2") {
|
109 | myobj["99"] = null;
|
110 | }
|
111 | console.log(x)
|
112 | }
|
113 | '
|
114 |
|
115 | echo ---
|
116 | echo 'JS REMOVE OBJ'
|
117 |
|
118 | nodejs -e '
|
119 | let myobj = {"1": null, "2": null, "3": null, "4": null}
|
120 | for (let x in myobj) {
|
121 | if (x === "2") {
|
122 | delete myobj["1"];
|
123 | delete myobj["3"];
|
124 | }
|
125 | console.log(x)
|
126 | }
|
127 | '
|
128 |
|
129 |
|
130 | echo ---
|
131 | echo 'JS var'
|
132 |
|
133 | nodejs -e '
|
134 | var mylist = [1,2,3]
|
135 | for (var x of mylist) {
|
136 | if (x === 2) {
|
137 | mylist.push(99)
|
138 | }
|
139 | console.log(x)
|
140 | }
|
141 | '
|
142 | }
|
143 |
|
144 | mutate-sh() {
|
145 | local sh=${1:-bash}
|
146 |
|
147 | echo ---
|
148 | echo sh=$sh
|
149 |
|
150 | $sh -c '
|
151 | declare -a mylist=(1 2 3)
|
152 | for x in "${mylist[@]}"; do
|
153 | if test $x == 2; then
|
154 | mylist+=(99)
|
155 | fi
|
156 | echo $x
|
157 | done
|
158 | echo "${mylist[@]}"
|
159 | '
|
160 | }
|
161 |
|
162 | YSH=${YSH:-bin/ysh}
|
163 |
|
164 | mutate-ysh() {
|
165 | echo ---
|
166 | echo 'YSH List'
|
167 |
|
168 | $YSH -c '
|
169 | var mylist = [1,2,3]
|
170 | for x in (mylist) {
|
171 | if (x === 2) {
|
172 | call mylist->append(99)
|
173 | }
|
174 | echo $x
|
175 | }
|
176 | '
|
177 |
|
178 | echo ---
|
179 | echo 'YSH Dict'
|
180 |
|
181 | $YSH -c '
|
182 | var mydict = {"1": null, "2": null, "3": null}
|
183 | for x in (mydict) {
|
184 | if (x === "2") {
|
185 | setvar mydict["99"] = null
|
186 | }
|
187 | echo $x
|
188 | }
|
189 | '
|
190 | }
|
191 |
|
192 | compare-mutate() {
|
193 | mutate-py
|
194 | mutate-js
|
195 | mutate-sh bash
|
196 | mutate-sh osh
|
197 | mutate-ysh
|
198 | }
|
199 |
|
200 | "$@"
|