source: doc/theses/mike_brooks_MMath/content/string/sharing-demo.json @ b230091

ADTast-experimentalenumpthread-emulationqualifiedEnum
Last change on this file since b230091 was 8e819a9, checked in by Michael Brooks <mlbrooks@…>, 3 years ago

Mike MMath initial

  • Property mode set to 100644
File size: 15.7 KB
Line 
1{
2    "demo1":[
3        {   "type":"text",
4            "value":"Consider two strings s1 and s1a that are in an aliasing relationship, and a third, s2, made by a simple copy from s1."
5        },
6        {   "type":"demo",
7            "vars":["s1", "s1a", "s2"],
8            "steps":[
9                {   "code":["string s1  = \"abc\";",
10                            "string s1a = s1`shareEdits;",
11                            "string s2  = s1;"],
12                    "endvals":{
13                        "s1":"abc",
14                        "s1a":"abc",
15                        "s2":"abc"
16                    }
17                }
18            ]
19        },
20        {   "type":"text",
21            "value":"Aliasing (@`shareEdits@) means that changes flow in both directions; with a simple copy, they do not."
22        },
23        {   "type":"demo",
24            "vars":["s1", "s1a", "s2"],
25            "steps":[
26                {   "endvals":{
27                        "s1":"abc",
28                        "s1a":"abc",
29                        "s2":"abc"
30                    }
31                },
32                {   "code":["s1 [1] = '+';"],
33                    "endvals":{
34                        "s1":"a+c",
35                        "s1a":"a+c",
36                        "s2":"abc"
37                    }
38                },
39                {   "code":["s1a[1] = '-';"],
40                    "endvals":{
41                        "s1":"a-c",
42                        "s1a":"a-c",
43                        "s2":"abc"
44                    }
45                },
46                {   "code":["s2 [1] = '|';"],
47                    "endvals":{
48                        "s1":"a-c",
49                        "s1a":"a-c",
50                        "s2":"a|c"
51                    }
52                }
53            ]
54        },
55        {   "type":"text",
56            "value":"Assignment of a value is just a modificiation.  The aliasing relationship is established at construction and is unaffected by assignment of a value."
57        },
58        {   "type":"demo",
59            "vars":["s1", "s1a", "s2"],
60            "steps":[
61                {   "endvals":{
62                        "s1":"a-c",
63                        "s1a":"a-c",
64                        "s2":"a|c"
65                    }
66                },
67                {   "code":["s1  = \"qrs\";"],
68                    "endvals":{
69                        "s1":"qrs",
70                        "s1a":"qrs",
71                        "s2":"a|c"
72                    }
73                },
74                {   "code":["s1a = \"tuv\";"],
75                    "endvals":{
76                        "s1":"tuv",
77                        "s1a":"tuv",
78                        "s2":"a|c"
79                    }
80                },
81                {   "code":["s2  = \"wxy\";"],
82                    "endvals":{
83                        "s1":"tuv",
84                        "s1a":"tuv",
85                        "s2":"wxy"
86                    }
87                }
88            ]
89        },
90        {   "type":"text",
91            "value":"Assignment from a string is just assignment of a value.  RHS participaing in aliasing (or not) is irrelevant.  Aliasing of LHS is unaffected."
92        },
93        {   "type":"demo",
94            "vars":["s1", "s1a", "s2"],
95            "steps":[
96                {   "endvals":{
97                        "s1":"tuv",
98                        "s1a":"tuv",
99                        "s2":"wxy"
100                    }
101                },
102                {   "code":["s1  = s2;"],
103                    "endvals":{
104                        "s1":"wxy",
105                        "s1a":"wxy",
106                        "s2":"wxy"
107                    }
108                },
109                {   "code":["s1  = \"aaa\";"],
110                    "endvals":{
111                        "s1":"aaa",
112                        "s1a":"aaa",
113                        "s2":"wxy"
114                    }
115                },
116                {   "code":["s2  = s1;"],
117                    "endvals":{
118                        "s1":"aaa",
119                        "s1a":"aaa",
120                        "s2":"aaa"
121                    }
122                },
123                {   "code":["s2  = \"bbb\";"],
124                    "endvals":{
125                        "s1":"aaa",
126                        "s1a":"aaa",
127                        "s2":"bbb"
128                    }
129                },
130                {   "code":["s2  = s1a;"],
131                    "endvals":{
132                        "s1":"aaa",
133                        "s1a":"aaa",
134                        "s2":"aaa"
135                    }
136                },
137                {   "code":["s2  = \"ccc\";"],
138                    "endvals":{
139                        "s1":"aaa",
140                        "s1a":"aaa",
141                        "s2":"ccc"
142                    }
143                },
144                {   "code":["s1  = \"xxx\";"],
145                    "endvals":{
146                        "s1":"xxx",
147                        "s1a":"xxx",
148                        "s2":"ccc"
149                    }
150                }
151            ]
152        }
153    ],
154    "demo2":[
155        {   "type":"text",
156            "value":"Consider new strings @s1_mid@ being an alias for a run in the middle of @s1@, along with @s2@, made by a simple copy from the middle of @s1@."
157        },
158        {   "type":"demo",
159            "vars":["s1", "s1_mid", "s2"],
160            "steps":[
161                {   "code":["string s1     = \"abcd\";",
162                            "string s1_mid = s1(1,3)`shareEdits;",
163                            "string s2     = s1(1,3);"],
164                    "endvals":{
165                        "s1":"abcd",
166                        "s1_mid":"bc",
167                        "s2":"bc"
168                    }
169                }
170            ]
171        },
172        {   "type":"text",
173            "value":"Again, @`shareEdits@ passes changes in both directions; copy does not.  Note the difference in index values, with the \\emph{b} position being 1 in the longer string and 0 in the shorter strings.  In the case of s1 aliasing with @s1_mid@, the very same character is being accessed by different postitions."
174        },
175        {   "type":"demo",
176            "vars":["s1", "s1_mid", "s2"],
177            "steps":[
178                {   "endvals":{
179                        "s1":"abcd",
180                        "s1_mid":"bc",
181                        "s2":"bc"
182                    }
183                },
184                {   "code":["s1    [1] = '+';"],
185                    "endvals":{
186                        "s1":"a+cd",
187                        "s1_mid":"+c",
188                        "s2":"bc"
189                    }
190                },
191                {   "code":["s1_mid[0] = '-';"],
192                    "endvals":{
193                        "s1":"a-cd",
194                        "s1_mid":"-c",
195                        "s2":"bc"
196                    }
197                },
198                {   "code":["s2    [0] = '|';"],
199                    "endvals":{
200                        "s1":"a-cd",
201                        "s1_mid":"-c",
202                        "s2":"|c"
203                    }
204                }
205            ]
206        },
207        {   "type":"text",
208            "value":"Once again, assignment of a value is a modificiation that flows through the aliasing relationship, without affecting its structure."
209        },
210        {   "type":"demo",
211            "vars":["s1", "s1_mid", "s2"],
212            "steps":[
213                {   "endvals":{
214                        "s1":"a-cd",
215                        "s1_mid":"-c",
216                        "s2":"|c"
217                    }
218                },
219                {   "code":["s1_mid = \"ff\";"],
220                    "endvals":{
221                        "s1":"affd",
222                        "s1_mid":"ff",
223                        "s2":"|c"
224                    }
225                },
226                {   "code":["s2     = \"gg\";"],
227                    "endvals":{
228                        "s1":"affd",
229                        "s1_mid":"ff",
230                        "s2":"gg"
231                    }
232                }
233            ]
234        },
235        {   "type":"text",
236            "value":"In the \\emph{ff} step, which is a positive example of flow across an aliasing relationship, the result is straightforward to accept because the flow direction is from contained (small) to containing (large).  The following rules for edits through aliasing substrings will guide how to flow in the opposite direction.\n\n"
237        },
238        {   "type":"text",
239            "value":"Growth and shrinkage are natural extensions.  An empty substring is a real thing, at a well-defined location, whose meaning is extrapolated from the examples so far.  The intended metaphor is to operating a GUI text editor.  Having an aliasing substring is like using the mouse to select a few words.  Assigning onto an aliasign substring is like typing from having a few words selected:  depending how much you type, the file being edited can get shorter or longer."
240        },
241        {   "type":"demo",
242            "vars":["s1", "s1_mid"],
243            "steps":[
244                {   "endvals":{
245                        "s1":"affd",
246                        "s1_mid":"fc"
247                    }
248                },
249                {   "code":["s1_mid = \"hhhh\";"],
250                    "endvals":{
251                        "s1":"ahhhhd",
252                        "s1_mid":"hhhh"
253                    }
254                },
255                {   "code":["s1_mid = \"i\";"],
256                    "endvals":{
257                        "s1":"aid",
258                        "s1_mid":"i"
259                    }
260                },
261                {   "code":["s1_mid = \"\";"],
262                    "endvals":{
263                        "s1":"ad"
264                    }
265                },
266                {   "code":["s1_mid = \"jj\";"],
267                    "endvals":{
268                        "s1":"ajjd",
269                        "s1_mid":"jj"
270                    }
271                }
272            ]
273        },
274        {   "type":"text",
275            "value":"Multiple portions can be aliased.  When there are several aliasing substrings at once, the text editor analogy becomes an online multi-user editor.  I should be able to edit a paragraph in one place (changing the document's length), without my edits affecting which letters are within a mouse-selection that you had made previously, somewhere else."
276        },
277        {   "type":"demo",
278            "vars":["s1", "s1_bgn", "s1_mid", "s1_end"],
279            "steps":[
280                {   "code":["string s1_bgn = s1(0, 1)`shareEdits;",
281                            "string s1_end = s1(3, 4)`shareEdits;"],
282                    "endvals":{
283                        "s1":"ajjd",
284                        "s1_bgn":"a",
285                        "s1_mid":"jj",
286                        "s1_end":"d"
287                    }
288                },
289                {   "code":["s1_bgn = \"zzzz\";"],
290                    "endvals":{
291                        "s1":"zzzzjjd",
292                        "s1_bgn":"zzzz",
293                        "s1_mid":"jj",
294                        "s1_end":"d"
295                    }
296                }
297            ]
298        },
299        {   "type":"text",
300            "value":"When an edit happens on an aliasing substring that overlaps another, an effect is unavoidable.  Here, the passive party sees its selection shortened, to exclude the characters that were not part of the original selection."
301        },
302        {   "type":"demo",
303            "vars":["s1", "s1_bgn", "s1_crs", "s1_mid", "s1_end"],
304            "steps":[
305                {   "code":["string s1_crs = s1(3, 5)`shareEdits;"],
306                    "endvals":{
307                        "s1":"zzzzjjd",
308                        "s1_bgn":"zzzz",
309                        "s1_crs":"zj",
310                        "s1_mid":"jj",
311                        "s1_end":"d"
312                    }
313                },
314                {   "code":["s1_crs = \"+++\";"],
315                    "endvals":{
316                        "s1":"zzz+++jd",
317                        "s1_bgn":"zzz",
318                        "s1_crs":"+++",
319                        "s1_mid":"j",
320                        "s1_end":"d"
321                    }
322                }
323            ]
324        },
325        {   "type":"text",
326            "value":"This shortening behaviour means that a modification has to occur entirely inside a substring, to show up in that substring.  Sharing changes through the intersection of partially overlapping aliases is still possible, so long as the receiver's boundary is not inside the edit."
327        },
328        {   "type":"demo",
329            "vars":["word", "consonants", "miniscules"],
330            "steps":[
331                {   "code":["string word = \"Phi\";",
332                            "string consonants = word(0,2)`shareEdits;",
333                            "string miniscules = word(1,3)`shareEdits;"],
334                    "endvals":{
335                        "word":"Phi",
336                        "consonants":"Ph",
337                        "miniscules":"hi"
338                    }
339                },
340                {   "code":["consonants[1] = 's';"],
341                    "endvals":{
342                        "word":"Psi",
343                        "consonants":"Ps",
344                        "miniscules":"si"
345                    }
346                }
347            ]
348        },
349        {   "type":"text",
350            "value":"The extreme form of this shortening happens when a bystander alias is a proper substring of an edit.  The bystander becomes an empty substring."
351        },
352        {   "type":"demo",
353            "vars":["all", "greet", "greet_bgn", "greet_end"],
354            "steps":[
355                {   "code":["string all = \"They said hello again\";",
356                            "string greet     = all(10,15)`shareEdits;",
357                            "string greet_bgn = all(10,11)`shareEdits;",
358                            "string greet_end = all(14,15)`shareEdits;"],
359                    "endvals":{
360                        "all":"They said hello again",
361                        "greet":"hello",
362                        "greet_bgn":"h",
363                        "greet_end":"o"
364                    }
365                },
366                {   "code":["greet = \"sup\";"],
367                    "endvals":{
368                        "all":"They said sup again",
369                        "greet":"sup"
370                    }
371                }
372            ]
373        },
374        {   "type":"text",
375            "value":"As in the earlier step where \\emph{aj} becomes \\emph{ajjd}, such empty substrings maintain their places in the total string, and can be used for filling it.  Because @greet_bgn@ was orginally at the start of the edit, in the outcome, the empty @greet_bgn@ sits just before the written value.  Similarly @greed_end@ goes after.  Though not shown, an overwritten substring at neither side goes arbitrarily to the before side."
376        },
377        {   "type":"demo",
378            "vars":["all", "greet", "greet_bgn", "greet_end"],
379            "steps":[
380                {   "code":["greet_bgn = \"what\"; "],
381                    "endvals":{
382                        "all":"They said whatsup again",
383                        "greet":"sup",
384                        "greet_bgn":"what"
385                    }
386                },
387                {   "code":["greet_end = \"...\"; "],
388                    "endvals":{
389                        "all":"They said whatsup... again",
390                        "greet":"sup",
391                        "greet_bgn":"what",
392                        "greet_end":"..."
393                    }
394                }
395            ]
396        },
397        {   "type":"text",
398            "value":"Though these empty substrings hold their places in the total string, an empty string only belongs to bigger strings when it occurs completely inside them.  There is no such state as including an empty substring at an edge.  For this reason, @word@ gains the characters added by assigning to @greet_bgn@ and @greet_end@, but the string @greet@ does not."
399        }
400
401       
402    ]
403}
Note: See TracBrowser for help on using the repository browser.