- Timestamp:
- Mar 14, 2025, 7:15:01 PM (12 days ago)
- Branches:
- master
- Children:
- 8617ee90
- Parents:
- 7611631
- Location:
- doc/theses/mike_brooks_MMath
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified doc/theses/mike_brooks_MMath/programs/sharing-demo.cfa ¶
r7611631 r06ffa95 11 11 // sout | "Consider two strings @s1@ and @s1a@ that are in an aliasing relationship, and a third, @s2@, made by a simple copy from @s1@."; 12 12 13 #define S1 string s1 14 #define S1A string s1a = s1`share Edits15 #define S2 string s2 = s113 #define S1 string s1 = "abc" 14 #define S1A string s1a = s1`share 15 #define S2 string s2 = s1a 16 16 S1; 17 17 S1A; … … 23 23 open( outfile, "build/sharing1.tex" ); 24 24 outfile | "\\begin{cquote}"; 25 outfile | "\\begin{tabular}{@{} llll@{}}";25 outfile | "\\begin{tabular}{@{}rlll@{}}"; 26 26 outfile | "\t\t\t& @s1@\t& @s1a@\t& @s2@\t\\\\"; 27 outfile | xstr(S1) | "\t \\\\";28 outfile | xstr(S1A) | "\t \\\\";29 outfile | xstr(S2) | "\t& " | s1 | "\t& " | s1a | "\t& " | s2;30 outfile | "\\end{tabular}"; 31 outfile | "\\end{cquote}"; 32 close( outfile ); 33 34 // sout | "Aliasing (@`share Edits@) means that changes flow in both directions; with a simple copy, they do not.";27 outfile | xstr(S1) | "\t& @\"" | s1 | "\"@\t\\\\"; 28 outfile | xstr(S1A) | "\t& \t& @\"" | s1a | "\"@\t\\\\"; 29 outfile | xstr(S2) | "\t& \t& \t& @\"" | s2 | "\"@"; 30 outfile | "\\end{tabular}"; 31 outfile | "\\end{cquote}"; 32 close( outfile ); 33 34 // sout | "Aliasing (@`share@) means that changes flow in both directions; with a simple copy, they do not."; 35 35 open( outfile, "build/sharing2.tex" ); 36 36 outfile | "\\begin{cquote}"; 37 outfile | "\\begin{tabular}{@{} llll@{}}";37 outfile | "\\begin{tabular}{@{}rlll@{}}"; 38 38 outfile | "\t\t& @s1@\t& @s1a@\t& @s2@\t\\\\"; 39 outfile | "\\multicolumn{1}{r}{initial} & " | s1 | "\t& " | s1a | "\t& " | s2 | "\t\\\\";40 41 #define S1s1 s1 39 outfile | "\\multicolumn{1}{r}{initial} & @\"" | s1 | "\"@\t& @\"" | s1a | "\"@\t& @\"" | s2 | "\"@\t\\\\"; 40 41 #define S1s1 s1[1] = '+' 42 42 S1s1; 43 43 assert( s1 == "a+c" ); 44 outfile | xstr(S1s1) | "\t& " | s1 | "\t& " | s1a | "\t& " | s2 | "\t\\\\";44 outfile | xstr(S1s1) | "\t& @\"" | s1 | "\"@\t& @\"" | s1a | "\"@\t& @\"" | s2 | "\"@\t\\\\"; 45 45 46 46 #define S1As1 s1a[1] = '-' 47 47 S1As1; 48 48 assert( s1a == "a-c" ); 49 outfile | xstr(S1As1) | "\t& " | s1 | "\t& " | s1a | "\t& " | s2 | "\t\\\\";50 51 #define S2s1 s2 49 outfile | xstr(S1As1) | "\t& @\"" | s1 | "\"@\t& @\"" | s1a | "\"@\t& @\"" | s2 | "\"@\t\\\\"; 50 51 #define S2s1 s2[1] = '|' 52 52 S2s1; 53 53 assert( s2 == "a|c" ); 54 outfile | xstr(S2s1) | "\t& " | s1 | "\t& " | s1a | "\t& " | s2;54 outfile | xstr(S2s1) | "\t& @\"" | s1 | "\"@\t& @\"" | s1a | "\"@\t& @\"" | s2 | "\"@"; 55 55 outfile | "\\end{tabular}"; 56 56 outfile | "\\end{cquote}"; … … 61 61 open( outfile, "build/sharing3.tex" ); 62 62 outfile | "\\begin{cquote}"; 63 outfile | "\\begin{tabular}{ llll}";63 outfile | "\\begin{tabular}{@{}rlll@{}}"; 64 64 outfile | "\t\t& @s1@\t& @s1a@\t& @s2@\t\\\\"; 65 outfile | "\\multicolumn{1}{r}{initial} & " | s1 | "\t& " | s1a | "\t& " | s2 | "\t\\\\";65 outfile | "\\multicolumn{1}{r}{initial} & @\"" | s1 | "\"@\t& @\"" | s1a | "\"@\t& @\"" | s2 | "\"@\t\\\\"; 66 66 67 67 #define S1qrs s1 = "qrs" 68 68 S1qrs; 69 69 assert( s1 == "qrs" ); 70 outfile | xstr(S1qrs) | "\t& " | s1 | "\t& " | s1a | "\t& " | s2 | "\t\\\\";70 outfile | xstr(S1qrs) | "\t& @\"" | s1 | "\"@\t& @\"" | s1a | "\"@\t& @\"" | s2 | "\"@\t\\\\"; 71 71 72 72 #define S1Atuv s1a = "tuv" 73 73 S1Atuv; 74 74 assert( s1a == "tuv" ); 75 outfile | xstr(S1Atuv) | "\t& " | s1 | "\t& " | s1a | "\t& " | s2 | "\t\\\\";75 outfile | xstr(S1Atuv) | "\t& @\"" | s1 | "\"@\t& @\"" | s1a | "\"@\t& @\"" | s2 | "\"@\t\\\\"; 76 76 77 77 #define S2wxy s2 = "wxy" 78 78 S2wxy; 79 79 assert( s2 == "wxy" ); 80 outfile | xstr(S2wxy) | "\t& " | s1 | "\t& " | s1a | "\t& " | s2;80 outfile | xstr(S2wxy) | "\t& @\"" | s1 | "\"@\t& @\"" | s1a | "\"@\t& @\"" | s2 | "\"@"; 81 81 outfile | "\\end{tabular}"; 82 82 outfile | "\\end{cquote}"; … … 87 87 open( outfile, "build/sharing4.tex" ); 88 88 outfile | "\\begin{cquote}"; 89 outfile | "\\begin{tabular}{ llll}";89 outfile | "\\begin{tabular}{@{}rlll@{}}"; 90 90 outfile | "\t\t& @s1@\t& @s1a@\t& @s2@\t\\\\"; 91 outfile | "\\multicolumn{1}{r}{initial} & " | s1 | "\t& " | s1a | "\t& " | s2 | "\t\\\\";91 outfile | "\\multicolumn{1}{r}{initial} & @\"" | s1 | "\"@\t& @\"" | s1a | "\"@\t& @\"" | s2 | "\"@\t\\\\"; 92 92 93 93 #define S1S2 s1 = s2 … … 96 96 assert( s1a == "wxy" ); 97 97 assert( s2 == "wxy" ); 98 outfile | xstr(S1S2) | "\t& " | s1 | "\t& " | s1a | "\t& " | s2 | "\t\\\\";98 outfile | xstr(S1S2) | "\t& @\"" | s1 | "\"@\t& @\"" | s1a | "\"@\t& @\"" | s2 | "\"@\t\\\\"; 99 99 100 100 #define S1aaa s1 = "aaa" … … 103 103 assert( s1a == "aaa" ); 104 104 assert( s2 == "wxy" ); 105 outfile | xstr(S1aaa) | "\t& " | s1 | "\t& " | s1a | "\t& " | s2 | "\t\\\\";105 outfile | xstr(S1aaa) | "\t& @\"" | s1 | "\"@\t& @\"" | s1a | "\"@\t& @\"" | s2 | "\"@\t\\\\"; 106 106 107 107 #define S2S1 s2 = s1 … … 110 110 assert( s1a == "aaa" ); 111 111 assert( s2 == "aaa" ); 112 outfile | xstr(S2S1) | "\t& " | s1 | "\t& " | s1a | "\t& " | s2 | "\t\\\\";112 outfile | xstr(S2S1) | "\t& @\"" | s1 | "\"@\t& @\"" | s1a | "\"@\t& @\"" | s2 | "\"@\t\\\\"; 113 113 114 114 #define S2bbb s2 = "bbb" … … 117 117 assert( s1a == "aaa" ); 118 118 assert( s2 == "bbb" ); 119 outfile | xstr(S2bbb) | "\t& " | s1 | "\t& " | s1a | "\t& " | s2 | "\t\\\\";119 outfile | xstr(S2bbb) | "\t& @\"" | s1 | "\"@\t& @\"" | s1a | "\"@\t& @\"" | s2 | "\"@\t\\\\"; 120 120 121 121 #define S2S1a s2 = s1a … … 124 124 assert( s1a == "aaa" ); 125 125 assert( s2 == "aaa" ); 126 outfile | xstr(S2S1a) | "\t& " | s1 | "\t& " | s1a | "\t& " | s2 | "\t\\\\";126 outfile | xstr(S2S1a) | "\t& @\"" | s1 | "\"@\t& @\"" | s1a | "\"@\t& @\"" | s2 | "\"@\t\\\\"; 127 127 128 128 #define S2ccc s2 = "ccc" … … 131 131 assert( s1a == "aaa" ); 132 132 assert( s2 == "ccc" ); 133 outfile | xstr(S2ccc) | "\t& " | s1 | "\t& " | s1a | "\t& " | s2 | "\t\\\\";133 outfile | xstr(S2ccc) | "\t& @\"" | s1 | "\"@\t& @\"" | s1a | "\"@\t& @\"" | s2 | "\"@\t\\\\"; 134 134 135 135 #define S1xxx s1 = "xxx" … … 138 138 assert( s1a == "xxx" ); 139 139 assert( s2 == "ccc" ); 140 outfile | xstr(S1xxx) | "\t& " | s1 | "\t& " | s1a | "\t& " | s2 | "\t\\\\";140 outfile | xstr(S1xxx) | "\t& @\"" | s1 | "\"@\t& @\"" | s1a | "\"@\t& @\"" | s2 | "\"@"; 141 141 outfile | "\\end{tabular}"; 142 142 outfile | "\\end{cquote}"; … … 149 149 open( outfile, "build/sharing5.tex" ); 150 150 outfile | "\\begin{cquote}"; 151 outfile | "\\begin{tabular}{ llll}";151 outfile | "\\begin{tabular}{@{}rlll@{}}"; 152 152 outfile | "\t\t\t\t& @s1@\t& @s1_mid@\t& @s2@\t\\\\"; 153 153 154 #define D2_s1_abcd string s1 154 #define D2_s1_abcd string s1 = "abcd" 155 155 D2_s1_abcd; 156 outfile | xstr(D2_s1_abcd) | "\t \\\\";157 158 #define D2_s1mid_s1 string s1_mid = s1(1,2)`share Edits156 outfile | xstr(D2_s1_abcd) | "\t& @\"" | s1 | "\"@\t\\\\"; 157 158 #define D2_s1mid_s1 string s1_mid = s1(1,2)`share 159 159 D2_s1mid_s1; 160 outfile | xstr(D2_s1mid_s1) | "\t \\\\";161 162 #define D2_s2_s1 string s2 = s1(1,2)160 outfile | xstr(D2_s1mid_s1) | "\t& \t& @\"" | s1_mid | "\"@\t\\\\"; 161 162 #define D2_s2_s1 string s2 = s1_mid(0,2) 163 163 D2_s2_s1; 164 164 assert( s1 == "abcd" ); 165 165 assert( s1_mid == "bc" ); 166 166 assert( s2 == "bc" ); 167 outfile | xstr(D2_s2_s1) | "\t& " | s1 | "\t& " | s1_mid | "\t& " | s2 | "\t\\\\";168 outfile | "\\end{tabular}"; 169 outfile | "\\end{cquote}"; 170 close( outfile ); 171 172 // sout | "Again, @`share Edits@ 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.";167 outfile | xstr(D2_s2_s1) | "\t& \t& \t& @\"" | s2 | "\"@"; 168 outfile | "\\end{tabular}"; 169 outfile | "\\end{cquote}"; 170 close( outfile ); 171 172 // sout | "Again, @`share@ 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."; 173 173 open( outfile, "build/sharing6.tex" ); 174 174 outfile | "\\begin{cquote}"; 175 outfile | "\\begin{tabular}{ llll}";175 outfile | "\\begin{tabular}{@{}rlll@{}}"; 176 176 outfile | "\t\t\t\t& @s1@\t& @s1_mid@\t& @s2@\t\\\\"; 177 outfile | "\\multicolumn{1}{r}{initial} & " | s1 | "\t& " | s1_mid | "\t& " | s2 | "\t\\\\";177 outfile | "\\multicolumn{1}{r}{initial} & @\"" | s1 | "\"@\t& @\"" | s1_mid | "\"@\t& @\"" | s2 | "\"@\t\\\\"; 178 178 179 179 #define D2_s1_plus s1 [1] = '+' … … 182 182 assert( s1_mid == "+c" ); 183 183 assert( s2 == "bc" ); 184 outfile | xstr(D2_s1_plus) | "\t& " | s1 | "\t& " | s1_mid | "\t& " | s2 | "\t\\\\";184 outfile | xstr(D2_s1_plus) | "\t& @\"" | s1 | "\"@\t& @\"" | s1_mid | "\"@\t& @\"" | s2 | "\"@\t\\\\"; 185 185 186 186 #define D2_s1mid_minus s1_mid[0] = '-' … … 189 189 assert( s1_mid == "-c" ); 190 190 assert( s2 == "bc" ); 191 outfile | xstr(D2_s1mid_minus) | "\t& " | s1 | "\t& " | s1_mid | "\t& " | s2 | "\t\\\\";191 outfile | xstr(D2_s1mid_minus) | "\t& @\"" | s1 | "\"@\t& @\"" | s1_mid | "\"@\t& @\"" | s2 | "\"@\t\\\\"; 192 192 193 193 #define D2_s2_pipe s2 [0] = '|' … … 196 196 assert( s1_mid == "-c" ); 197 197 assert( s2 == "|c" ); 198 outfile | xstr(D2_s2_pipe) | "\t& " | s1 | "\t& " | s1_mid | "\t& " | s2 | "\t\\\\";198 outfile | xstr(D2_s2_pipe) | "\t& @\"" | s1 | "\"@\t& @\"" | s1_mid | "\"@\t& @\"" | s2 | "\"@\t"; 199 199 outfile | "\\end{tabular}"; 200 200 outfile | "\\end{cquote}"; … … 204 204 open( outfile, "build/sharing7.tex" ); 205 205 outfile | "\\begin{cquote}"; 206 outfile | "\\begin{tabular}{ llll}";206 outfile | "\\begin{tabular}{@{}rlll@{}}"; 207 207 outfile | "\t\t\t\t& @s1@\t& @s1_mid@\t& @s2@\t\\\\"; 208 outfile | "\\multicolumn{1}{r}{initial} & " | s1 | "\t& " | s1_mid | "\t& " | s2 | "\t\\\\";208 outfile | "\\multicolumn{1}{r}{initial} & @\"" | s1 | "\"@\t& @\"" | s1_mid | "\"@\t& @\"" | s2 | "\"@\t\\\\"; 209 209 210 210 #define D2_s1mid_ff s1_mid = "ff" … … 213 213 assert( s1_mid == "ff" ); 214 214 assert( s2 == "|c" ); 215 outfile | xstr(D2_s1mid_ff) | "\t& " | s1 | "\t& " | s1_mid | "\t& " | s2 | "\t\\\\";215 outfile | xstr(D2_s1mid_ff) | "\t& @\"" | s1 | "\"@\t& @\"" | s1_mid | "\"@\t& @\"" | s2 | "\"@\t\\\\"; 216 216 217 217 #define D2_s2_gg s2 = "gg" … … 220 220 assert( s1_mid == "ff" ); 221 221 assert( s2 == "gg" ); 222 outfile | xstr(D2_s2_gg) | "\t& " | s1 | "\t& " | s1_mid | "\t& " | s2 | "\t\\\\";222 outfile | xstr(D2_s2_gg) | "\t& @\"" | s1 | "\"@\t& @\"" | s1_mid | "\"@\t& @\"" | s2 | "\"@\t"; 223 223 outfile | "\\end{tabular}"; 224 224 outfile | "\\end{cquote}"; … … 232 232 open( outfile, "build/sharing8.tex" ); 233 233 outfile | "\\begin{cquote}"; 234 outfile | "\\begin{tabular}{ lll}";234 outfile | "\\begin{tabular}{@{}rll@{}}"; 235 235 outfile | "\t\t\t\t& @s1@\t& @s1_mid@\t\\\\"; 236 outfile | "\\multicolumn{1}{r}{initial} & " | s1 | "\t& " | s1_mid | "\t\\\\";236 outfile | "\\multicolumn{1}{r}{initial} & @\"" | s1 | "\"@\t& @\"" | s1_mid | "\"@\t\\\\"; 237 237 238 238 assert( s1 == "affd" ); 239 239 // assert( s1_mid == "fc" ); // ????????? bug? 240 outfile | xstr(D2_s2_gg) | "\t& " | s1 | "\t& " | s1_mid | "\t\\\\";240 // outfile | xstr(D2_s2_gg) | "\t& @\"" | s1 | "\"@\t& @\"" | s1_mid | "\"@\t\\\\"; 241 241 242 242 #define D2_s1mid_hhhh s1_mid = "hhhh" … … 244 244 assert( s1 == "ahhhhd" ); 245 245 assert( s1_mid == "hhhh" ); 246 outfile | xstr(D2_s1mid_hhhh) | "\t& " | s1 | "\t& " | s1_mid | "\t\\\\";246 outfile | xstr(D2_s1mid_hhhh) | "\t& @\"" | s1 | "\"@\t& @\"" | s1_mid | "\"@\t\\\\"; 247 247 248 248 #define D2_s1mid_i s1_mid = "i" … … 250 250 assert( s1 == "aid" ); 251 251 assert( s1_mid == "i" ); 252 outfile | xstr(D2_s1mid_i) | "\t& " | s1 | "\t& " | s1_mid | "\t\\\\";252 outfile | xstr(D2_s1mid_i) | "\t& @\"" | s1 | "\"@\t& @\"" | s1_mid | "\"@\t\\\\"; 253 253 254 254 #define D2_s1mid_empty s1_mid = "" … … 256 256 assert( s1 == "ad" ); 257 257 // assert( s1_mid == "" ); ------ Should be so, but fails 258 outfile | xstr(D2_s1mid_empty) | "\t& " | s1 | "\t& " | s1_mid | "\t\\\\";258 outfile | xstr(D2_s1mid_empty) | "\t& @\"" | s1 | "\"@\t& @\"" | s1_mid | "\"@\t\\\\"; 259 259 260 260 #define D2_s1mid_jj s1_mid = "jj" … … 262 262 assert( s1 == "ajjd" ); 263 263 assert( s1_mid == "jj" ); 264 outfile | xstr(D2_s1mid_jj) | "\t& " | s1 | "\t& " | s1_mid | "\t\\\\";264 outfile | xstr(D2_s1mid_jj) | "\t& @\"" | s1 | "\"@\t& @\"" | s1_mid | "\"@\t"; 265 265 outfile | "\\end{tabular}"; 266 266 outfile | "\\end{cquote}"; … … 270 270 open( outfile, "build/sharing9.tex" ); 271 271 outfile | "\\begin{cquote}"; 272 outfile | "\\begin{tabular}{ lllll}";272 outfile | "\\begin{tabular}{@{}rllll@{}}"; 273 273 outfile | "\t\t\t\t& @s1@\t& @s1_bgn@\t& @s1_mid@\t& @s1_end@\t\\\\"; 274 275 #define D2_s1bgn_s1 string s1_bgn = s1(0, 1)`shareEdits 274 outfile | "\\multicolumn{1}{r}{initial} & @\"" | s1 | "\"@\t& & @\"" | s1_mid | "\"@\t\\\\"; 275 276 #define D2_s1bgn_s1 string s1_bgn = s1(0, 1)`share 276 277 D2_s1bgn_s1; 277 outfile | xstr(D2_s1bgn_s1) | "\t \\\\";278 279 #define D2_s1end_s1 string s1_end = s1(3, 1)`share Edits278 outfile | xstr(D2_s1bgn_s1) | "\t& \t& @\"" | s1_bgn | "\"@\t\\\\"; 279 280 #define D2_s1end_s1 string s1_end = s1(3, 1)`share 280 281 D2_s1end_s1; 282 outfile | xstr(D2_s1end_s1) | "\t& \t& \t& \t& @\"" | s1_end | "\"@\t\\\\"; 281 283 assert( s1 == "ajjd" ); 282 284 assert( s1_bgn == "a" ); 283 285 assert( s1_mid == "jj" ); 284 286 assert( s1_end == "d" ); 285 outfile | xstr(D2_s1end_s1) | "\t& " | s1 | "\t& " | s1_bgn | "\t& " | s1_mid | "\t& " | s1_end | "\t\\\\";286 287 287 288 #define D1_s1bgn_zzz s1_bgn = "zzzz" … … 291 292 assert( s1_mid == "jj" ); 292 293 assert( s1_end == "d" ); 293 outfile | xstr(D1_s1bgn_zzz) | "\t& " | s1 | "\t& " | s1_bgn | "\t& " | s1_mid | "\t& " | s1_end | "\t\\\\";294 outfile | xstr(D1_s1bgn_zzz) | "\t& @\"" | s1 | "\"@\t& @\"" | s1_bgn | "\"@\t& @\"" | s1_mid | "\"@\t& @\"" | s1_end | "\"@\t"; 294 295 outfile | "\\end{tabular}"; 295 296 outfile | "\\end{cquote}"; … … 299 300 open( outfile, "build/sharing10.tex" ); 300 301 outfile | "\\begin{cquote}"; 301 outfile | "\\begin{tabular}{ llllll}";302 outfile | "\\begin{tabular}{@{}rlllll@{}}"; 302 303 outfile | "\t\t\t\t& @s1@\t& @s1_bgn@\t& @s1_crs@\t& @s1_mid@\t& @s1_end@\t\\\\"; 303 304 #define D2_s1crs_s1 string s1_crs = s1(3, 2)`shareEdits 304 outfile | "\\multicolumn{1}{r}{initial} & @\"" | s1 | "\"@\t& @\"" | s1_bgn | "\"@\t& & @\"" | s1_mid | "\"@\t& @\"" | s1_end | "\"@\t\\\\"; 305 306 #define D2_s1crs_s1 string s1_crs = s1(3, 2)`share 305 307 D2_s1crs_s1; 306 308 assert( s1 == "zzzzjjd" ); … … 309 311 assert( s1_mid == "jj" ); 310 312 assert( s1_end == "d" ); 311 outfile | xstr(D2_s1crs_s1) | "\t& " | s1 | "\t& " | s1_bgn | "\t& " | s1_crs | "\t& " | s1_mid | "\t& " | s1_end | "\t\\\\";313 outfile | xstr(D2_s1crs_s1) | "\t& \t& \t& @\"" | s1_crs | "\"@\t\\\\"; 312 314 313 315 #define D2_s1crs_ppp s1_crs = "+++" … … 318 320 assert( s1_mid == "j" ); 319 321 assert( s1_end == "d" ); 320 outfile | xstr(D2_s1crs_ppp) | "\t& " | s1 | "\t& " | s1_bgn | "\t& " | s1_crs | "\t& " | s1_mid | "\t& " | s1_end | "\t\\\\";322 outfile | xstr(D2_s1crs_ppp) | "\t& @\"" | s1 | "\"@\t& @\"" | s1_bgn | "\"@\t& @\"" | s1_crs | "\"@\t& @\"" | s1_mid | "\"@\t& @\"" | s1_end | "\"@\t"; 321 323 outfile | "\\end{tabular}"; 322 324 outfile | "\\end{cquote}"; … … 326 328 327 329 string word = "Phi"; 328 string consonants = word(0,2)`share Edits;329 string miniscules = word(1,2)`share Edits;330 string consonants = word(0,2)`share; 331 string miniscules = word(1,2)`share; 330 332 assert( word == "Phi" ); 331 333 assert( consonants == "Ph" ); … … 340 342 341 343 string all = "They said hello again"; 342 string greet = all(10,5)`share Edits;343 string greet_bgn = all(10,1)`share Edits;344 string greet_end = all(14,1)`share Edits;344 string greet = all(10,5)`share; 345 string greet_bgn = all(10,1)`share; 346 string greet_end = all(14,1)`share; 345 347 346 348 assert( all == "They said hello again" ); -
TabularUnified doc/theses/mike_brooks_MMath/string.tex ¶
r7611631 r06ffa95 9 9 10 10 To prepare for the following discussion, comparisons among C, \CC, Java and \CFA strings are presented, beginning in \VRef[Figure]{f:StrApiCompare}. 11 It provides a classic ``cheat sheet'' presentation, summarizing the names of the most 11 It provides a classic ``cheat sheet'' presentation, summarizing the names of the most-common closely-equivalent operations. 12 12 The over-arching commonality is that operations work on groups of characters for assigning, copying, scanning, and updating. 13 13 … … 39 39 hence, most of its group operations are error prone and expensive. 40 40 Most high-level string libraries use a separate length field and specialized storage management to implement group operations. 41 Interestingly, \CC strings retain null termination justin case it is needed to interface with C library functions.41 Interestingly, \CC strings retain null termination in case it is needed to interface with C library functions. 42 42 \begin{cfa} 43 43 int open( @const char * pathname@, int flags ); … … 52 52 While \VRef[Figure]{f:StrApiCompare} emphasizes cross-language similarities, it elides many specific operational differences. 53 53 For example, the @replace@ function selects a substring in the target and substitutes it with the source string, which can be smaller or larger than the substring. 54 \CC performs the modification on the mutable receiver object .54 \CC performs the modification on the mutable receiver object 55 55 \begin{cfa} 56 56 string s1 = "abcde"; … … 60 60 \end{cfa} 61 61 while Java allocates and returns a new string with the result, leaving the receiver unmodified. 62 \label{p:JavaReplace} 62 63 \begin{java} 63 64 String s = "abcde"; 64 65 String r = s.replace( "cde", "xy" ); $\C[2.25in]{// replace by text, immutable}$ 66 System.out.println( s + ' ' + r ); 67 $\texttt{abcde abxy}$ 68 \end{java} 69 % Generally, Java's @String@ type is immutable. 70 Java provides a @StringBuffer@ near-analog that is mutable. 71 \begin{java} 65 72 StringBuffer sb = new StringBuffer( "abcde" ); 66 sb.replace( 2, 5, "xy" ); $\C {// replace by position, mutable}\CRT$67 System.out.println( s + ' ' + r + ' ' + sb );68 $\texttt{ab cde abxy abxy}$73 sb.replace( 2, 5, "xy" ); $\C[2.25in]{// replace by position, mutable}\CRT$ 74 System.out.println( sb ); 75 $\texttt{abxy}$ 69 76 \end{java} 70 Generally, Java's @String@ type is immutable. 71 Java provides a @StringBuffer@ near-analog that is mutable, but the differences are significant; for example, @StringBuffer@'s @substring@ functions still return copies rather than mutable selections.72 Finally, the operations between these type are asymmetric, \eg @ string@ has @replace@ by text but not replace by position and vice versa for @StringBuffer@.77 However, there are significant differences; 78 \eg, @StringBuffer@'s @substring@ function returns a @String@ copy that is immutable. 79 Finally, the operations between these type are asymmetric, \eg @String@ has @replace@ by text but not replace by position and vice versa for @StringBuffer@. 73 80 74 81 More significant operational differences relate to storage management, often appearing through assignment (@target = source@), and are summarized in \VRef[Figure]{f:StrSemanticCompare}. … … 140 147 $\texttt{\small abcde abcde abcde bcde cde}$ 141 148 \end{cfa} 142 Note, all of these strings rely on the single null termination character at the end of @s@.149 Note, all of these aliased strings rely on the single null termination character at the end of @s@. 143 150 The issue of symmetry does not apply to C strings because the value and pointer strings are essentially different types, and so this feature is scored as not applicable for C. 144 With the type not managing the text buffer, there is no ownership question, \ie operations on @s1@ or @s2@ never leads to their memory becoming reusable.151 With the type not managing the text storage, there is no ownership question, \ie operations on @s1@ or @s2@ never leads to their memory becoming reusable. 145 152 While @s3@ is a valid C-string that contains a proper substring of @s1@, the @s3@ technique does not constitute having a fragment referent because null termination implies the substring cannot be chosen arbitrarily; the technique works only for suffixes. 146 153 … … 157 164 \end{cfa} 158 165 The lax symmetry reflects how the validity of @s1@ depends on the content and lifetime of @s@. 159 It is common practice in \CC to use the @s1@-style pass by reference, with the understanding that the callee only use the referenced string for the duration of the call, \ie no side-effect using the parameter.160 So, when the called function is a constructor, it is typical to use an @s2@-style copy 166 It is common practice in \CC to use the @s1@-style pass by reference, with the understanding that the callee only uses the referenced string for the duration of the call, \ie no side-effect using the parameter. 167 So, when the called function is a constructor, it is typical to use an @s2@-style copy-initialization to string-object-typed member. 161 168 Exceptions to this pattern are possible, but require the programmer to assure safety where the type system does not. 162 The @s3@ initialization is constrained to copy the substring because @c_str@ always provides a null-terminated character, which is different fromsource string.169 The @s3@ initialization is constrained to copy the substring because @c_str@ always provides a null-terminated character, which may be different from the source string. 163 170 @s3@ assignment could be fast by reference counting the text area and using copy-on-write, but would require an implementation upgrade. 164 171 165 172 In Java, @String@ also offers a high-level abstraction: 166 \begin{ cfa}173 \begin{java} 167 174 String s = "abcde"; 168 175 String s1 = s; $\C[2.25in]{// snapshot state, strict symmetry, variable-constrained referent}$ … … 173 180 $\texttt{\small abcde abcde bc c}$ 174 181 $\texttt{\small true false false}$ 175 \end{ cfa}182 \end{java} 176 183 Note, @substring@ takes a start and end position, rather than a start position and length. 177 184 Here, facts about Java's implicit pointers and pointer equality can over complicate the picture, and so are ignored. … … 180 187 With @s2@, the case for fast-copy is more subtle. 181 188 Certainly, its value is not pointer-equal to @s@, implying at least a further allocation. 182 TODO: finish the fast-copy case. 183 Java's immutable strings mean aliasing is impossible with the @String@ type. 184 Java's @StringBuffer@ provides aliasing, though without supporting symmetric treatment of a fragment referent; as a result, @StringBuffer@ scores as \CC. 185 The easy symmetry that the Java string enjoys is aided by Java's garbage collection; Java's @s2@ is doing effectively the operation of \CC's @s2@, though without the consequence to of complicating memory management. 186 187 Finally, In \CFA, @string@ also offers a high-level abstraction: 189 \PAB{TODO: finish the fast-copy case.} 190 Java does not meet the aliasing requirement because immutability make it impossible to modify. 191 Java's @StringBuffer@ provides aliasing (see @replace@ example on \VPageref{p:JavaReplace}), though without supporting symmetric treatment of a fragment referent, \eg @substring@ of a @StringBuffer@ is a @String@; 192 as a result, @StringBuffer@ scores as \CC. 193 The easy symmetry that the Java string enjoys is aided by Java's garbage collection; Java's @s2@ is doing effectively the operation of \CC's @s3@, though without the consequence of complicating memory management. 194 \PAB{What complex storage management is going on here?} 195 196 Finally, in \CFA, @string@ also offers a high-level abstraction: 188 197 \begin{cfa} 189 198 string s = "abcde"; 190 199 string & s1 = s; $\C[2.25in]{// alias state, strict symmetry, variable-constrained referent}$ 191 200 string s2 = s; $\C{// snapshot state, strict symmetry, variable-constrained referent}$ 192 string s3 = s`share Edits; $\C{// alias state, strict symmetry, variable-constrained referent}\CRT$201 string s3 = s`share; $\C{// alias state, strict symmetry, variable-constrained referent}\CRT$ 193 202 string s4 = s( 1, 2 ); 194 203 string s5 = s4( 1, 1 ); … … 198 207 % all helpful criteria of \VRef[Figure]{f:StrSemanticCompare} are satisfied. 199 208 The \CFA string manages storage, handles all assignments, including those of fragment referents with fast initialization, provides the choice between snapshot and alias semantics, and does so symmetrically with one type (which assures text validity according to the lifecycles of the string variables). 200 With aliasing, the intuition is that each string is an editor on an open shared document. 201 With fragment aliasing, the intuition is that these editor views have been scrolled or zoomed to overlapping, but potentially different, ranges. 209 The intended metaphor for \CFA stings is similar to a GUI text-editor or web browser. 210 Select a consecutive block of text using the mouse generates an aliased substring in the file/dialog-box. 211 Typing into the selected area is like assigning to an aliased substring, where the highlighted text is replaced with more or less text; 212 depending on the text entered, the file/dialog-box content grows or shrinks. 213 \PAB{Need to discuss the example, as for the other languages.} 202 214 203 215 The remainder of this chapter explains how the \CFA string achieves this usage style. 204 216 205 217 206 207 218 \section{Storage Management} 208 219 209 220 This section discusses issues related to storage management of strings. 210 Specifically, it is common for strings to logically overlap completely or partially.221 Specifically, it is common for strings to logically overlap partially or completely. 211 222 \begin{cfa} 212 223 string s1 = "abcdef"; … … 218 229 s3[1] = 'w'; $\C{// what happens to s1 and s2?}$ 219 230 \end{cfa} 220 This question is the notion of mutable or immutable strings.221 For example, Java has immutable strings that are copiedwhen any overlapping string changes.222 Note, the notion of underlying string mutability is not specified by @const@ , \eg:231 which is restricted by a string's mutable or immutable property. 232 For example, Java's immutable strings require copy-on-write when any overlapping string changes. 233 Note, the notion of underlying string mutability is not specified by @const@; \eg in \CC: 223 234 \begin{cfa} 224 235 const string s1 = "abc"; 225 236 \end{cfa} 226 Here,@const@ applies to the @s1@ pointer to @"abc"@, and @"abc"@ is an immutable constant that is \emph{copied} into the string's storage.227 Hence, @s1@ is not pointing at an immutable constant, meaning its underlying string is always mutable, unless some other designation is specified, such as Java's globalrule.237 the @const@ applies to the @s1@ pointer to @"abc"@, and @"abc"@ is an immutable constant that is \emph{copied} into the string's storage. 238 Hence, @s1@ is not pointing at an immutable constant, meaning its underlying string can be mutable, unless some other designation is specified, such as Java's global immutable rule. 228 239 229 240 230 241 \subsection{Logical overlap} 231 242 232 \CFA provides a dynamic mechanism to indicate mutable or immutable as an assignment attribute: @`shareEdits@. 233 234 Consider two strings @s1@ and @s1a@ that are in an aliasing relationship, and a third, @s2@, made by a simple copy from @s1@. 235 Aliasing (@`shareEdits@) means that changes flow in both directions; with a simple copy, they do not. 243 \CFA provides a dynamic mechanism to indicate mutable or immutable using the attribute @`share@. 244 This aliasing relationship is a sticky-property established at initialization. 245 For example, here strings @s1@ and @s1a@ are in an aliasing relationship, while @s2@ is in a copy relationship. 236 246 \input{sharing1.tex} 237 238 Aliasing (@`shareEdits@) means that changes flow in both directions; with a simple copy, they do not. 247 Here, the aliasing (@`share@) causes partial changes (subscripting) to flow in both directions. 239 248 \input{sharing2.tex} 240 241 Assignment of a value is just a modification. 242 The aliasing relationship is established at construction and is unaffected by assignment of a value. 249 Similarly for complete changes. 243 250 \input{sharing3.tex} 244 251 245 Assignment from a string is just assignment of a value.246 Whether of not the RHS participates in aliasing is irrelevant. Anyaliasing of the LHS is unaffected.252 Because string assignment copies the value, RHS aliasing is irrelevant. 253 Hence, aliasing of the LHS is unaffected. 247 254 \input{sharing4.tex} 248 255 249 Consider new strings @s1_mid@ being an alias for a runin the middle of @s1@, along with @s2@, made by a simple copy from the middle of @s1@.256 Now, consider string @s1_mid@ being an alias in the middle of @s1@, along with @s2@, made by a simple copy from the middle of @s1@. 250 257 \input{sharing5.tex} 251 252 Again, @`shareEdits@ passes changes in both directions; copy does not. 253 Note the difference in index values, with the \emph{b} position being 1 in the longer string and 0 in the shorter strings. 254 In the case of s1 aliasing with @s1_mid@, the very same character is being accessed by different positions. 258 Again, @`share@ passes changes in both directions; copy does not. 259 As a result, the index values for the position of @b@ are 1 in the longer string @"abcd"@ and 0 in the shorter aliased string @"bc"@. 260 This alternate positioning also applies to subscripting. 255 261 \input{sharing6.tex} 256 262 257 Once again, assignment of a value is a modification that flows through the aliasing relationship,without affecting its structure.263 Finally, assignment flows through the aliasing relationship without affecting its structure. 258 264 \input{sharing7.tex} 259 260 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). 261 The following rules for edits through aliasing substrings will guide how to flow in the opposite direction. 262 263 Growth and shrinkage are natural extensions. 264 An empty substring is a real thing, at a well-defined location, whose meaning is extrapolated from the examples so far. 265 The intended metaphor is to operating a GUI text editor. 266 Having an aliasing substring is like using the mouse to select a few words. 267 Assigning onto an aliasing substring is like typing from having a few words selected: depending how much you type, the file being edited can get shorter or longer. 265 In the @"ff"@ assignment, the result is straightforward to accept because the flow direction is from contained (small) to containing (large). 266 The following rules explain aliasing substrings that flow in the opposite direction, large to small. 267 268 Growth and shrinkage are natural extensions, as for the text-editor example mentioned earlier, where an empty substring is as real real as an empty string. 268 269 \input{sharing8.tex} 269 270 270 Multiple portions can be aliased.271 When there are several aliasing substrings at once, the text editor analogy becomes an online multi-user editor.272 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.271 Multiple portions of a string can be aliased. 272 % When there are several aliasing substrings at once, the text editor analogy becomes an online multi-user editor. 273 %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. 273 274 \input{sharing9.tex} 274 275 When an edit happens on an aliasing substring that overlaps another, an effect is unavoidable. 276 Here, the passive party sees its selection shortened, to exclude the characters that were not part of the original selection.275 When @s1_bgn@'s size increases by 3, @s1_mid@'s starting location moves from 1 to 4 and @s1_end@'s from 3 to 6, 276 277 When changes happens on an aliasing substring that overlap. 277 278 \input{sharing10.tex} 278 279 TODO: finish typesetting the demo 279 Strings @s1_crs@ and @s1_mid@ overlap at character 4, @j@ because the substrings are 3,2 and 4,2. 280 When @s1_crs@'s size increases by 1, @s1_mid@'s starting location moves from 4 to 5, but the overlaping character remains, changing to @'+'@. 281 282 \PAB{TODO: finish typesetting the demo} 280 283 281 284 %\input{sharing-demo.tex}
Note: See TracChangeset
for help on using the changeset viewer.