OILS / demo / survey-loop.sh View on Github | oils.pub

200 lines, 59 significant
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
12set -o nounset
13set -o pipefail
14set -o errexit
15
16source build/dev-shell.sh # python3 in $PATH
17
18mutate-py() {
19 echo ---
20 echo PY
21
22 python3 -c '
23mylist = [1,2,3]
24for 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 '
35mylist = [1,2,3,4]
36for 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
47if false; then
48 # dict size changed during iteration!!
49 python3 -c '
50mydict = {1: None, 2: None, 3: None}
51for x in mydict:
52 if x == 2:
53 mydict[99] = None
54 print(x)
55'
56fi
57
58 echo ---
59 echo PY comp
60
61 python3 -c '
62def myappend(li, i):
63 if i == 1:
64 li.append(99)
65 print(i)
66 return i
67
68mylist = [1,2,3]
69y = [myappend(mylist, i) for i in mylist]
70print(y)
71'
72}
73
74mutate-js() {
75 echo ---
76 echo 'JS let'
77
78 nodejs -e '
79let mylist = [1,2,3]
80for (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 '
92let mylist = [1,2,3,4]
93for (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 '
106let myobj = {"1": null, "2": null, "3": null}
107for (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 '
119let myobj = {"1": null, "2": null, "3": null, "4": null}
120for (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 '
134var mylist = [1,2,3]
135for (var x of mylist) {
136 if (x === 2) {
137 mylist.push(99)
138 }
139 console.log(x)
140}
141'
142}
143
144mutate-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
162YSH=${YSH:-bin/ysh}
163
164mutate-ysh() {
165 echo ---
166 echo 'YSH List'
167
168 $YSH -c '
169var mylist = [1,2,3]
170for 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 '
182var mydict = {"1": null, "2": null, "3": null}
183for x in (mydict) {
184 if (x === "2") {
185 setvar mydict["99"] = null
186 }
187 echo $x
188}
189'
190}
191
192compare-mutate() {
193 mutate-py
194 mutate-js
195 mutate-sh bash
196 mutate-sh osh
197 mutate-ysh
198}
199
200"$@"