[686f731] | 1 | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> |
---|
| 2 | <html> |
---|
| 3 | <head> |
---|
| 4 | <meta http-equiv="content-type" content="text/html; charset=utf-8"/> |
---|
| 5 | <title></title> |
---|
| 6 | <meta name="generator" content="LibreOffice 5.1.6.2 (Linux)"/> |
---|
| 7 | <meta name="created" content="00:00:00"/> |
---|
| 8 | <meta name="changed" content="2019-04-30T12:17:26.683110610"/> |
---|
| 9 | <meta name="created" content="00:00:00"> |
---|
| 10 | <meta name="changed" content="2019-04-30T11:56:44.860373711"> |
---|
| 11 | <meta name="created" content="00:00:00"> |
---|
| 12 | <meta name="changed" content="2019-04-30T11:40:36.209830313"> |
---|
| 13 | <meta name="created" content="00:00:00"> |
---|
| 14 | <meta name="changed" content="2019-04-30T11:36:41.526514563"> |
---|
| 15 | <meta name="created" content="00:00:00"> |
---|
| 16 | <meta name="changed" content="2019-04-30T11:25:44.054610077"> |
---|
| 17 | <style type="text/css"> |
---|
| 18 | @page { margin: 2cm } |
---|
| 19 | p { margin-bottom: 0.25cm; line-height: 120% } |
---|
| 20 | td p { margin-bottom: 0cm; line-height: 120% } |
---|
| 21 | h1 { margin-bottom: 0.21cm } |
---|
| 22 | h1.western { font-family: "Liberation Sans", sans-serif; font-size: 18pt } |
---|
| 23 | h1.cjk { font-family: "Noto Sans CJK SC Regular"; font-size: 18pt } |
---|
| 24 | h1.ctl { font-family: "FreeSans"; font-size: 18pt } |
---|
| 25 | pre.cjk { font-family: "Courier New", monospace } |
---|
| 26 | a:link { so-language: zxx } |
---|
| 27 | </style> |
---|
| 28 | </head> |
---|
| 29 | <body lang="en-CA" dir="ltr"> |
---|
| 30 | <h1 class="western">Summary</h1> |
---|
| 31 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 32 | |
---|
| 33 | </p> |
---|
| 34 | <p style="margin-bottom: 0cm; font-variant: normal; font-style: normal; line-height: 100%"> |
---|
| 35 | This document presents a string API for Cforall that accommodates |
---|
| 36 | Unicode text while staying safe. The safety challenge is presented |
---|
| 37 | and addressed.</p> |
---|
| 38 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 39 | |
---|
| 40 | </p> |
---|
| 41 | <p style="margin-bottom: 0cm; font-variant: normal; font-style: normal; line-height: 100%"> |
---|
| 42 | UTF-8 is <span style="text-decoration: none"><i>the</i></span> |
---|
| 43 | format.</p> |
---|
| 44 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 45 | |
---|
| 46 | </p> |
---|
| 47 | <p style="margin-bottom: 0cm; font-variant: normal; font-style: normal; line-height: 100%"> |
---|
| 48 | Index-based operations in the public interface are reduced or |
---|
| 49 | eliminated. Indexing does not play well with UTF-8’s variable-width |
---|
| 50 | characters.</p> |
---|
| 51 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 52 | |
---|
| 53 | </p> |
---|
| 54 | <p style="margin-bottom: 0cm; font-variant: normal; font-style: normal; line-height: 100%"> |
---|
| 55 | Include-Exclude operations, which return a mutable reference into the |
---|
| 56 | original (a capture), completely take their place. These compose find |
---|
| 57 | (text -> index) with substring (index -> text), as text -> |
---|
| 58 | text. The basic mechanism is straight out of Buhr 94; what’s new |
---|
| 59 | here is a total devotion to it, and the decoupling of captures from |
---|
| 60 | in-exclude calls.</p> |
---|
| 61 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 62 | |
---|
| 63 | </p> |
---|
| 64 | <p style="margin-bottom: 0cm; font-variant: normal; font-style: normal; line-height: 100%"> |
---|
| 65 | Composable patterns are the subjects being in/excluded. Leaf pattern |
---|
| 66 | expressivity is exact-sequence and repeat character-class, not |
---|
| 67 | regular expression (same as Buhr 94). A leaf pattern can, but does |
---|
| 68 | not have to, offer a capture. An adjacency-composed pattern can |
---|
| 69 | capture too.</p> |
---|
| 70 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 71 | |
---|
| 72 | </p> |
---|
| 73 | <p style="margin-bottom: 0cm; font-variant: normal; font-style: normal; line-height: 100%"> |
---|
| 74 | Operator syntax, generalizing current sin-sout pipes, is the pattern |
---|
| 75 | glue. Basic-case string parsing looks the same as current sin |
---|
| 76 | reading. The more nuanced cases allow overriding behaviours like |
---|
| 77 | controlling whitespace treatment.</p> |
---|
| 78 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 79 | |
---|
| 80 | </p> |
---|
| 81 | <p style="margin-bottom: 0cm; font-variant: normal; font-style: normal; line-height: 100%"> |
---|
| 82 | A capture wraps and hides a byte-level reference into variable-width |
---|
| 83 | text. It stays valid under length-changing mutations of the original. |
---|
| 84 | In UTF-8, even single-character overwrite is a byte-length changing |
---|
| 85 | operation (when done safely, in the general case).</p> |
---|
| 86 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 87 | |
---|
| 88 | </p> |
---|
| 89 | <p style="margin-bottom: 0cm; font-variant: normal; font-style: normal; line-height: 100%"> |
---|
| 90 | A representation of buffer-gap-buffer enables these stable captures. |
---|
| 91 | The gap changes size under editing, moves under cursor advancing, and |
---|
| 92 | is skipped under reading. The cursor move copies characters from the |
---|
| 93 | gap-adjacent source-end of one buffer to gap-adjacent sink-end of the |
---|
| 94 | other.</p> |
---|
| 95 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 96 | |
---|
| 97 | </p> |
---|
| 98 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 99 | |
---|
| 100 | </p> |
---|
| 101 | <h1 class="western"><meta name="created" content="00:00:00"><meta name="changed" content="2019-04-30T09:48:29.629318918">The |
---|
| 102 | Unicode challenge</h1> |
---|
| 103 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 104 | |
---|
| 105 | </p> |
---|
| 106 | <p style="margin-bottom: 0cm; line-height: 100%"><meta name="changed" content="2019-04-24T17:30:13.350273625">UTF-8 |
---|
| 107 | is the current (spring 2019) standard for text encoding. Java and |
---|
| 108 | .NET use two-byte encodings, which is an older approach. UTF-8 |
---|
| 109 | supports the full universe of Unicode text. A new language like CFA |
---|
| 110 | must support UTF-8, likely even treat it as <i>the</i> native format.</p> |
---|
| 111 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 112 | |
---|
| 113 | </p> |
---|
| 114 | <p style="margin-bottom: 0cm; line-height: 100%">UTF-8 is a |
---|
| 115 | variable-width encoding. Every string from the 128-character ASCII |
---|
| 116 | aphabet is also a UTF-8 string. If the extra bit (which sends a byte |
---|
| 117 | beyond the 128 characters) is set, then the byte is the start of a |
---|
| 118 | character that uses at least two bytes. And so on. Up to 4 bytes, |
---|
| 119 | which covers the 17 defined Unicode planes, including the overhead |
---|
| 120 | the tagging. If 17 planes are not enough for you, but 256 planes |
---|
| 121 | ought to be, then that takes 6 bytes, including the tagging; this |
---|
| 122 | would cover the all the characters expressible with the (obscure) |
---|
| 123 | UTF-32 (aka UCS-4) 4-byte fixed-width encoding.</p> |
---|
| 124 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 125 | |
---|
| 126 | </p> |
---|
| 127 | <p style="margin-bottom: 0cm; line-height: 100%">The variable-width |
---|
| 128 | encoding is a challenge for the string operations <i>length</i> and |
---|
| 129 | <i>index.</i> An API’s semantics must decide bewteen character- and |
---|
| 130 | byte-based counting. Suppose an API supports operations stuctured as, |
---|
| 131 | “give me the range of length m, starting at position i, from this |
---|
| 132 | string, which you have told me has length n, where I know i <= n – |
---|
| 133 | m + 1.” (This presentation uses a 1-based location count; the |
---|
| 134 | choice of base is independent of the semantics under discussion.) For |
---|
| 135 | example, in all encodings, and in all semantics being discussed, when |
---|
| 136 | doing this operation on “Hello, world!” with i=8, m=5 and n=13, |
---|
| 137 | the result is “world” and has length 5. This sematic uniformity |
---|
| 138 | happens because all letters in the example string have equal length |
---|
| 139 | in all encodings.</p> |
---|
| 140 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 141 | |
---|
| 142 | </p> |
---|
| 143 | <p style="margin-bottom: 0cm; line-height: 100%">Contrasting more |
---|
| 144 | interesting examples:</p> |
---|
| 145 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 146 | |
---|
| 147 | </p> |
---|
| 148 | <p style="margin-bottom: 0cm; line-height: 100%">B8 = Byte-counting |
---|
| 149 | sematics on UTF-8 encoding</p> |
---|
| 150 | <p style="margin-bottom: 0cm; line-height: 100%">C8 = |
---|
| 151 | Character-counting semantics on UTF-8 encoding</p> |
---|
| 152 | <p style="margin-bottom: 0cm; line-height: 100%">2B16 = |
---|
| 153 | Double-byte-counting semantics on UTF-16 encoding. This is what Java |
---|
| 154 | and .NET use.</p> |
---|
| 155 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 156 | |
---|
| 157 | </p> |
---|
| 158 | <table width="665" cellpadding="4" cellspacing="0"> |
---|
| 159 | <col width="456"> |
---|
| 160 | <col width="71"> |
---|
| 161 | <col width="56"> |
---|
| 162 | <col width="48"> |
---|
| 163 | <tr valign="top"> |
---|
| 164 | <td width="456" style="border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 165 | <p><br/> |
---|
| 166 | |
---|
| 167 | </p> |
---|
| 168 | </td> |
---|
| 169 | <td width="71" style="border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 170 | <p align="center">B8</p> |
---|
| 171 | </td> |
---|
| 172 | <td width="56" style="border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 173 | <p align="center">C8</p> |
---|
| 174 | </td> |
---|
| 175 | <td width="48" style="border: 1px solid #000000; padding: 0.1cm"> |
---|
| 176 | <p align="center">2B16</p> |
---|
| 177 | </td> |
---|
| 178 | </tr> |
---|
| 179 | <tr valign="top"> |
---|
| 180 | <td width="456" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 181 | <p>Length of: u</p> |
---|
| 182 | </td> |
---|
| 183 | <td width="71" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 184 | <p align="center">1</p> |
---|
| 185 | </td> |
---|
| 186 | <td width="56" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 187 | <p align="center">1</p> |
---|
| 188 | </td> |
---|
| 189 | <td width="48" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm"> |
---|
| 190 | <p align="center">1</p> |
---|
| 191 | </td> |
---|
| 192 | </tr> |
---|
| 193 | <tr valign="top"> |
---|
| 194 | <td width="456" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 195 | <p>Length of: ü</p> |
---|
| 196 | </td> |
---|
| 197 | <td width="71" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 198 | <p align="center">2</p> |
---|
| 199 | </td> |
---|
| 200 | <td width="56" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 201 | <p align="center">1</p> |
---|
| 202 | </td> |
---|
| 203 | <td width="48" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm"> |
---|
| 204 | <p align="center">1</p> |
---|
| 205 | </td> |
---|
| 206 | </tr> |
---|
| 207 | <tr valign="top"> |
---|
| 208 | <td width="456" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 209 | <p>Length of: <font face="Noto Sans CJK SC Regular"><span lang="zh-CN"><font face="Noto Sans CJK SC Regular"><font size="2" style="font-size: 10pt"><span lang="zh-CN">福</span></font></font></span></font></p> |
---|
| 210 | </td> |
---|
| 211 | <td width="71" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 212 | <p align="center">3</p> |
---|
| 213 | </td> |
---|
| 214 | <td width="56" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 215 | <p align="center">1</p> |
---|
| 216 | </td> |
---|
| 217 | <td width="48" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm"> |
---|
| 218 | <p align="center">1</p> |
---|
| 219 | </td> |
---|
| 220 | </tr> |
---|
| 221 | <tr valign="top"> |
---|
| 222 | <td width="456" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 223 | <p>Length of: |
---|
| 224 | <img src="data:image/png;base64,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" name="Image1" align="middle" width="13" height="36" border="0"/> |
---|
| 225 | |
---|
| 226 | (U+1D11E)</p> |
---|
| 227 | </td> |
---|
| 228 | <td width="71" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 229 | <p align="center">4</p> |
---|
| 230 | </td> |
---|
| 231 | <td width="56" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 232 | <p align="center">1</p> |
---|
| 233 | </td> |
---|
| 234 | <td width="48" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm"> |
---|
| 235 | <p align="center">2</p> |
---|
| 236 | </td> |
---|
| 237 | </tr> |
---|
| 238 | <tr valign="top"> |
---|
| 239 | <td width="456" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 240 | <p>Are ill-aligned range specifications possible?</p> |
---|
| 241 | </td> |
---|
| 242 | <td width="71" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 243 | <p align="center">Yes</p> |
---|
| 244 | </td> |
---|
| 245 | <td width="56" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 246 | <p align="center">No</p> |
---|
| 247 | </td> |
---|
| 248 | <td width="48" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm"> |
---|
| 249 | <p align="center">Yes</p> |
---|
| 250 | </td> |
---|
| 251 | </tr> |
---|
| 252 | <tr valign="top"> |
---|
| 253 | <td width="456" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 254 | <p>Complexity of length operation, assuming start- and |
---|
| 255 | end-locations known</p> |
---|
| 256 | </td> |
---|
| 257 | <td width="71" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 258 | <p align="center">O(1)</p> |
---|
| 259 | </td> |
---|
| 260 | <td width="56" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 261 | <p align="center">O(n)</p> |
---|
| 262 | </td> |
---|
| 263 | <td width="48" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm"> |
---|
| 264 | <p align="center">O(1)</p> |
---|
| 265 | </td> |
---|
| 266 | </tr> |
---|
| 267 | <tr valign="top"> |
---|
| 268 | <td width="456" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 269 | <p>Complexity of substring operation</p> |
---|
| 270 | </td> |
---|
| 271 | <td width="71" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 272 | <p align="center">O(1)</p> |
---|
| 273 | </td> |
---|
| 274 | <td width="56" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 275 | <p align="center">O(i+m)</p> |
---|
| 276 | </td> |
---|
| 277 | <td width="48" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm"> |
---|
| 278 | <p align="center">O(1)</p> |
---|
| 279 | </td> |
---|
| 280 | </tr> |
---|
| 281 | </table> |
---|
| 282 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 283 | |
---|
| 284 | </p> |
---|
| 285 | <p style="margin-bottom: 0cm; line-height: 100%">Thus, “B” |
---|
| 286 | semantics put an onus on the programmer that “C” semantics handle |
---|
| 287 | in the library, for a runtime cost.</p> |
---|
| 288 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 289 | |
---|
| 290 | </p> |
---|
| 291 | <p style="margin-bottom: 0cm; line-height: 100%">Typical string APIs |
---|
| 292 | impose position-based operations on programmers. But programmers |
---|
| 293 | would rather be position-agnostic. Outside of string-APU example |
---|
| 294 | programs, numbers passed to substring operations are usually the |
---|
| 295 | result of find operations. The find-substring composition is text-in, |
---|
| 296 | text-out. Tinkering with the numbers in between often happens, such |
---|
| 297 | as to codify the intention, “except leave off the delimeter.” |
---|
| 298 | This is where bugs happen, because cases like the delimiter being |
---|
| 299 | dynamic, and showing up with a byte-width longer than one are hard to |
---|
| 300 | conceive. [TODO: cite UTF-16 being problematic like this] A degree of |
---|
| 301 | security or internationalization expertise is needed to consider |
---|
| 302 | relevant test cases that leave the Basic Multilingual Plane.</p> |
---|
| 303 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 304 | |
---|
| 305 | </p> |
---|
| 306 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 307 | |
---|
| 308 | </p> |
---|
| 309 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 310 | |
---|
| 311 | </p> |
---|
| 312 | <h1 class="western">Length-changing operations</h1> |
---|
| 313 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 314 | |
---|
| 315 | </p> |
---|
| 316 | <p style="margin-bottom: 0cm; line-height: 100%">Mutations that |
---|
| 317 | change a string’s length are prominent in early (pre-2019) work on |
---|
| 318 | CFA string support, and on Buhr-94 strings. For example:</p> |
---|
| 319 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 320 | |
---|
| 321 | </p> |
---|
| 322 | <pre class="western" style="margin-bottom: 0.5cm"> replace("123456789", "456", "") // result: "123789"</pre><p style="margin-bottom: 0cm; line-height: 100%"> |
---|
| 323 | The previous unicode discussion clarified that, under B8 semantics, |
---|
| 324 | this too is a length-changing operation:</p> |
---|
| 325 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 326 | |
---|
| 327 | </p> |
---|
| 328 | <pre class="western" style="margin-bottom: 0.5cm"> <font face="Liberation Mono, monospace">replace("francais", "c", "ç") // result: "français"</font></pre><p style="margin-bottom: 0cm; line-height: 100%"> |
---|
| 329 | <br/> |
---|
| 330 | |
---|
| 331 | </p> |
---|
| 332 | <p style="margin-bottom: 0cm; line-height: 100%">This proposal |
---|
| 333 | supports doing such operations as mutations.</p> |
---|
| 334 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 335 | |
---|
| 336 | </p> |
---|
| 337 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 338 | |
---|
| 339 | </p> |
---|
| 340 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 341 | |
---|
| 342 | </p> |
---|
| 343 | <h1 class="western">Solution Principles</h1> |
---|
| 344 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 345 | |
---|
| 346 | </p> |
---|
| 347 | <p style="margin-bottom: 0cm; line-height: 100%">Abstract all |
---|
| 348 | byte-length awareness within the string API. No public B semantics |
---|
| 349 | when a user does parsing.</p> |
---|
| 350 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 351 | |
---|
| 352 | </p> |
---|
| 353 | <p style="margin-bottom: 0cm; line-height: 100%">Offer powerful |
---|
| 354 | text-to-text operations on the public interface. There is a potential |
---|
| 355 | to extend this expressivity to regular-expression matching, but |
---|
| 356 | current detailed work focuses on character-class and exact-sequence |
---|
| 357 | constructs.</p> |
---|
| 358 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 359 | |
---|
| 360 | </p> |
---|
| 361 | <p style="margin-bottom: 0cm; line-height: 100%">Remove most |
---|
| 362 | number-based operations from the public interface. No illusion of |
---|
| 363 | general-purpose random access.</p> |
---|
| 364 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 365 | |
---|
| 366 | </p> |
---|
| 367 | <p style="margin-bottom: 0cm; line-height: 100%">Offer |
---|
| 368 | character-class matching in the public interface. “Match: Any * 3” |
---|
| 369 | is the only way to chunk off characters by number of occurrences; |
---|
| 370 | this has strictly C semantics. This supports off-by-a-couple |
---|
| 371 | adjustements when writing a parsing routine, guarantees |
---|
| 372 | wide-character correctness, and puts the operation in a place where |
---|
| 373 | O(n) is reasonable, as n is expected to be small.</p> |
---|
| 374 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 375 | |
---|
| 376 | </p> |
---|
| 377 | <p style="margin-bottom: 0cm; line-height: 100%">Refine an API-use |
---|
| 378 | style in which character-widths are only tested once. Provide |
---|
| 379 | examples in this style and explanations of why this happens. Re-work |
---|
| 380 | low-level designs as needed to ensure naive usage avoids re-checks.</p> |
---|
| 381 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 382 | |
---|
| 383 | </p> |
---|
| 384 | <p style="margin-bottom: 0cm; line-height: 100%">Offer a few coarse |
---|
| 385 | chunking operations that work with a max-bytes parameter, documented |
---|
| 386 | as helpers for batching cases. Return a well-aligned result (of |
---|
| 387 | indeterminate C-semantic length), by leveraging UTF-8 tagging, in |
---|
| 388 | which a start-of-character is easy to find. “Copy to c-string” is |
---|
| 389 | one such operation.</p> |
---|
| 390 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 391 | |
---|
| 392 | </p> |
---|
| 393 | <p style="margin-bottom: 0cm; line-height: 100%">Support |
---|
| 394 | substrings/selections that straddle mutations points by following an |
---|
| 395 | “open binder” design, introduced below.</p> |
---|
| 396 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 397 | |
---|
| 398 | </p> |
---|
| 399 | <p style="margin-bottom: 0cm; line-height: 100%">The rest of the doc |
---|
| 400 | presents detail suggesting the above is achievable. The reader may |
---|
| 401 | thus entertain the hypothesis that all desirable string manipulation |
---|
| 402 | can take place without an index-exposing API.</p> |
---|
| 403 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 404 | |
---|
| 405 | </p> |
---|
| 406 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 407 | |
---|
| 408 | </p> |
---|
| 409 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 410 | |
---|
| 411 | </p> |
---|
| 412 | <h1 class="western">Text-to-text API, rev 1</h1> |
---|
| 413 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 414 | |
---|
| 415 | </p> |
---|
| 416 | <p style="margin-bottom: 0cm; line-height: 100%">This starter API is |
---|
| 417 | an example of the text-to-text style, and C-style public semantics, |
---|
| 418 | suggested earlier. It is presented mainly to clarify those concepts |
---|
| 419 | before continuing. |
---|
| 420 | </p> |
---|
| 421 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 422 | |
---|
| 423 | </p> |
---|
| 424 | <p style="margin-bottom: 0cm; line-height: 100%">Note that matched |
---|
| 425 | substrings write through into the original.</p> |
---|
| 426 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 427 | |
---|
| 428 | </p> |
---|
| 429 | <p style="margin-bottom: 0cm; line-height: 100%">The recommended API |
---|
| 430 | still woks this way, but also adds more control over which |
---|
| 431 | (writeable) parts get captured into variables, enabling more useful |
---|
| 432 | find-replace mutation cases.</p> |
---|
| 433 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 434 | |
---|
| 435 | </p> |
---|
| 436 | <pre class="western"> string s, qs, s1, s2; |
---|
| 437 | charclass qcc;</pre><p style="margin-bottom: 0cm; line-height: 100%"> |
---|
| 438 | Split s once, with q on the left:</p> |
---|
| 439 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 440 | |
---|
| 441 | </p> |
---|
| 442 | <pre class="western"> [s1, s2] = include(s, qs); |
---|
| 443 | assert s == s1 + s2; |
---|
| 444 | assert s1 == "" || s1 == qs; |
---|
| 445 | |
---|
| 446 | [s1, s2] = include(s, qcc); |
---|
| 447 | assert s == s1 + s2; |
---|
| 448 | for (c1: s1) assert ismatch(c1, qcc); |
---|
| 449 | assert s2 == "" || ismatch(first(s2), qcc);</pre><p> |
---|
| 450 | Split s once, with q on the right:</p> |
---|
| 451 | <pre class="western"> [s1, s2] = exclude(s, qs); |
---|
| 452 | assert s == s1 + s2; |
---|
| 453 | assert ["", _] == include(s1, qs) |
---|
| 454 | assert [qs, _] == include(s2, qs) |
---|
| 455 | |
---|
| 456 | [s1, s2] = exclude(s, qcc); |
---|
| 457 | assert ["", s1] == include(s1, qcc); |
---|
| 458 | assert s2 == "" || include(s2, qcc).0 != ""</pre><p style="margin-bottom: 0cm; line-height: 100%"> |
---|
| 459 | <br/> |
---|
| 460 | |
---|
| 461 | </p> |
---|
| 462 | <p style="margin-bottom: 0cm; line-height: 100%">All results are |
---|
| 463 | writeable references:</p> |
---|
| 464 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 465 | |
---|
| 466 | </p> |
---|
| 467 | <pre class="western"> // demonstration on 1<sup>st</sup> return of 1<sup>st</sup> API function; others are similar |
---|
| 468 | |
---|
| 469 | [s1, s2] = include(s, qs); |
---|
| 470 | assert s == s1 + s2; |
---|
| 471 | assert s1 == "" || s1 == qs; |
---|
| 472 | |
---|
| 473 | s1 = "hi"; |
---|
| 474 | assert s == "hi" + s2; |
---|
| 475 | |
---|
| 476 | int s_len_old = len(s), |
---|
| 477 | s2_len_old = len(s2); |
---|
| 478 | s1 = "<font face="Courier New, monospace"><span lang="zh-CN"><font face="Noto Sans CJK SC Regular"><font size="2" style="font-size: 10pt"><span lang="zh-CN">福</span></font></font></span></font>"; // (2 ch, 2 b) overwritten with (1 ch, 3 b) |
---|
| 479 | assert len(s) == s_len_old – 1; // length counts logical characters |
---|
| 480 | assert len(s2) == s2_len_old; // s2 is intact, logically unaffected, yet at different distance from front</pre><p style="margin-bottom: 0cm; line-height: 100%"> |
---|
| 481 | Splitting this way works in loops. In the examples following, think |
---|
| 482 | of q as a delimiter. Note how two steps are combined into a single |
---|
| 483 | call: get everything up to next q; move past the q.</p> |
---|
| 484 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 485 | |
---|
| 486 | </p> |
---|
| 487 | <p style="margin-bottom: 0cm; line-height: 100%">Split s repeatedly, |
---|
| 488 | with q ending each match:</p> |
---|
| 489 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 490 | |
---|
| 491 | </p> |
---|
| 492 | <pre class="western"> string ss = ""; |
---|
| 493 | for ([s1,s2] in split_ex(s, q)) { |
---|
| 494 | assert [s1, s2] == exclude(s1 + s2, q); |
---|
| 495 | ss += s1; |
---|
| 496 | ss += s2; |
---|
| 497 | } |
---|
| 498 | assert ss == s;</pre><p style="margin-bottom: 0cm; line-height: 100%"> |
---|
| 499 | <br/> |
---|
| 500 | |
---|
| 501 | </p> |
---|
| 502 | <p style="margin-bottom: 0cm; line-height: 100%">Split s repeatedly, |
---|
| 503 | with q starting each match:</p> |
---|
| 504 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 505 | |
---|
| 506 | </p> |
---|
| 507 | <pre class="western"> string ss = ""; |
---|
| 508 | for ([s1,s2] in split_in(s, q)) { |
---|
| 509 | assert [s1, s2] == include(s1 + s2, q); |
---|
| 510 | ss += s1; |
---|
| 511 | ss += s2; |
---|
| 512 | } |
---|
| 513 | assert ss == s;</pre><p style="margin-bottom: 0cm; line-height: 100%"> |
---|
| 514 | <br/> |
---|
| 515 | |
---|
| 516 | </p> |
---|
| 517 | <h1 class="western">Recommended API</h1> |
---|
| 518 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 519 | |
---|
| 520 | </p> |
---|
| 521 | <p style="margin-bottom: 0cm; line-height: 100%">This discussion |
---|
| 522 | strives for concreteness at the risk of painting the design into a |
---|
| 523 | corner. Many details still need to be worked through. The most |
---|
| 524 | significant point of feedback sought here is whether the |
---|
| 525 | algebra-of-patterns is appropriate and sufficient.</p> |
---|
| 526 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 527 | |
---|
| 528 | </p> |
---|
| 529 | <p style="margin-bottom: 0cm; line-height: 100%">The Rev-1 API gets |
---|
| 530 | awkward on cases like:</p> |
---|
| 531 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 532 | |
---|
| 533 | </p> |
---|
| 534 | <pre class="western"> string s = "a=1, b=2, c=3, "; |
---|
| 535 | string kv, del, k, eqv, eq, v; |
---|
| 536 | for ([kv,del] in split_ex(s, ", ")) { |
---|
| 537 | [k,eqv] = exclude(kv, "="); |
---|
| 538 | [eq,v] = include(eqv, "="); |
---|
| 539 | kv = k + v; |
---|
| 540 | del = ":"; |
---|
| 541 | } |
---|
| 542 | assert s == "a1:b2:c3";</pre><p style="margin-bottom: 0cm; line-height: 100%"> |
---|
| 543 | Points of awkwardness are:</p> |
---|
| 544 | <ul> |
---|
| 545 | <li/> |
---|
| 546 | <p style="margin-bottom: 0cm; line-height: 100%">Multiple API |
---|
| 547 | calls on the "=" matching are still not averted</p> |
---|
| 548 | <li/> |
---|
| 549 | <p style="margin-bottom: 0cm; line-height: 100%">No substring |
---|
| 550 | capturing all of "a=1, ". If we had one, say scur, the |
---|
| 551 | following assignment would be more natural than the pair in the |
---|
| 552 | example:</p> |
---|
| 553 | <ul> |
---|
| 554 | <pre class="western" style="margin-bottom: 0.5cm">scur = k + v + ":"</pre> |
---|
| 555 | </ul> |
---|
| 556 | <li/> |
---|
| 557 | <p style="margin-bottom: 0cm; line-height: 100%">We declare |
---|
| 558 | names for substrings that are only used to target the next API call.</p> |
---|
| 559 | </ul> |
---|
| 560 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 561 | |
---|
| 562 | </p> |
---|
| 563 | <p style="margin-bottom: 0cm; line-height: 100%">The recommended API |
---|
| 564 | treats the rev-1 points as composable primitives, and separates (in |
---|
| 565 | general) pattern from capture.</p> |
---|
| 566 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 567 | |
---|
| 568 | </p> |
---|
| 569 | <pre class="western"> string s = "a=1, b=2, c=3, "; |
---|
| 570 | while (string ss = s, string k, string v, string scur; |
---|
| 571 | nextMatch(ss, scur & (k ^ "=" | v ^ ", ")) |
---|
| 572 | ) { |
---|
| 573 | scur = k + v + ":"; |
---|
| 574 | } |
---|
| 575 | assert s == "a1:b2:c3";</pre><p style="margin-bottom: 0cm; line-height: 100%"> |
---|
| 576 | Some work is still needed on the ss declaration, and the |
---|
| 577 | iterator-loop syntactic interaction (nextMatch). Lower-level work has |
---|
| 578 | explored the possibility of integrating it with “0 ~ 10”-like |
---|
| 579 | stepping.</p> |
---|
| 580 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 581 | |
---|
| 582 | </p> |
---|
| 583 | <p style="margin-bottom: 0cm; line-height: 100%">The top-level |
---|
| 584 | construct is nextMatch(string, pattern). It matches the pattern |
---|
| 585 | against the front of the string; this is described recursively next.</p> |
---|
| 586 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 587 | |
---|
| 588 | </p> |
---|
| 589 | <p style="margin-bottom: 0cm; line-height: 100%">The combinators |, ^ |
---|
| 590 | and & all do pattern op pattern -> pattern.</p> |
---|
| 591 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 592 | |
---|
| 593 | </p> |
---|
| 594 | <p style="margin-bottom: 0cm; line-height: 100%">Base cases</p> |
---|
| 595 | <ul> |
---|
| 596 | <li/> |
---|
| 597 | <p style="margin-bottom: 0cm; line-height: 100%">A read-only |
---|
| 598 | string is a pattern that matches exactly one occurrence of itself.</p> |
---|
| 599 | <li/> |
---|
| 600 | <p style="margin-bottom: 0cm; line-height: 100%">A writeable |
---|
| 601 | string is a pattern that matches anything.</p> |
---|
| 602 | <li/> |
---|
| 603 | <p style="margin-bottom: 0cm; line-height: 100%">Overloading |
---|
| 604 | to be built out to make, e.g. a writeable int qualify as a pattern |
---|
| 605 | that matches the character class [0-9].</p> |
---|
| 606 | <li/> |
---|
| 607 | <p style="margin-bottom: 0cm; line-height: 100%">Note this |
---|
| 608 | presentation considers a separate problem: <i>how</i> we |
---|
| 609 | differentiate a writeable string from a read-only (or COW) string</p> |
---|
| 610 | <li/> |
---|
| 611 | <p style="margin-bottom: 0cm; line-height: 100%">Expressivity |
---|
| 612 | = charclass, exact sequence</p> |
---|
| 613 | </ul> |
---|
| 614 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 615 | |
---|
| 616 | </p> |
---|
| 617 | <p style="margin-bottom: 0cm; line-height: 100%">The operators, in |
---|
| 618 | their natural precendence order from loosest to tightest, and being |
---|
| 619 | naturally left-associative, give the recursive cases:</p> |
---|
| 620 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 621 | |
---|
| 622 | </p> |
---|
| 623 | <table width="665" cellpadding="4" cellspacing="0"> |
---|
| 624 | <col width="36"> |
---|
| 625 | <col width="95"> |
---|
| 626 | <col width="508"> |
---|
| 627 | <tr valign="top"> |
---|
| 628 | <td width="36" style="border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 629 | <p>L|R</p> |
---|
| 630 | </td> |
---|
| 631 | <td width="95" style="border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 632 | <p>inclusive then</p> |
---|
| 633 | </td> |
---|
| 634 | <td width="508" style="border: 1px solid #000000; padding: 0.1cm"> |
---|
| 635 | <p>L consumes all characters that the L-pattern accepts, then R |
---|
| 636 | begins from the first character that L rejects. |
---|
| 637 | </p> |
---|
| 638 | </td> |
---|
| 639 | </tr> |
---|
| 640 | <tr valign="top"> |
---|
| 641 | <td width="36" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 642 | <p>L^R</p> |
---|
| 643 | </td> |
---|
| 644 | <td width="95" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 645 | <p>exclusive then</p> |
---|
| 646 | </td> |
---|
| 647 | <td width="508" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm"> |
---|
| 648 | <p>L consumes all characters that the R-pattern rejects, then R |
---|
| 649 | begins from the first character that R accepts.</p> |
---|
| 650 | </td> |
---|
| 651 | </tr> |
---|
| 652 | <tr valign="top"> |
---|
| 653 | <td width="36" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 654 | <p>L&R</p> |
---|
| 655 | </td> |
---|
| 656 | <td width="95" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 657 | <p>same as</p> |
---|
| 658 | </td> |
---|
| 659 | <td width="508" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm"> |
---|
| 660 | <p style="margin-bottom: 0.5cm">General meaning: Both sides have |
---|
| 661 | to match the same run of characters.</p> |
---|
| 662 | <p>Expected use: pairing a restrictive complex non-writeable |
---|
| 663 | pattern with a permissive simple writeable pattern, the latter |
---|
| 664 | declaring an alias for the result</p> |
---|
| 665 | </td> |
---|
| 666 | </tr> |
---|
| 667 | </table> |
---|
| 668 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 669 | |
---|
| 670 | </p> |
---|
| 671 | <p style="margin-bottom: 0cm; line-height: 100%"><font color="#000000">The |
---|
| 672 | semantics of failing to match need to be nailed down. Basically, the |
---|
| 673 | suggestion is</font></p> |
---|
| 674 | <ul> |
---|
| 675 | <li/> |
---|
| 676 | <p style="margin-bottom: 0cm; line-height: 100%"><font color="#000000">don’t |
---|
| 677 | throw exception</font></p> |
---|
| 678 | <li/> |
---|
| 679 | <p style="margin-bottom: 0cm; line-height: 100%"><font color="#000000">don’t |
---|
| 680 | end up in an infinite loop (matching zero more chars each time)</font></p> |
---|
| 681 | <li/> |
---|
| 682 | <p style="margin-bottom: 0cm; line-height: 100%"><font color="#000000">just |
---|
| 683 | exit the loop</font></p> |
---|
| 684 | </ul> |
---|
| 685 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 686 | |
---|
| 687 | </p> |
---|
| 688 | <p style="margin-bottom: 0cm; line-height: 100%"><font color="#000000">Work |
---|
| 689 | is in progress describing an iterator-processing model for these |
---|
| 690 | patterns which includes modeling no-more-matches.</font></p> |
---|
| 691 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 692 | |
---|
| 693 | </p> |
---|
| 694 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 695 | |
---|
| 696 | </p> |
---|
| 697 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 698 | |
---|
| 699 | </p> |
---|
| 700 | <h1 class="western">Unification with streams</h1> |
---|
| 701 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 702 | |
---|
| 703 | </p> |
---|
| 704 | <p style="margin-bottom: 0cm; line-height: 100%">It is desirable that |
---|
| 705 | a | b | c have analogous meanings, when done on a string or on |
---|
| 706 | standard-in. As it is also done to standard-out, this in turn |
---|
| 707 | suggests the string append operator will also become |.</p> |
---|
| 708 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 709 | |
---|
| 710 | </p> |
---|
| 711 | <p style="margin-bottom: 0cm; line-height: 100%">The stream sout, |
---|
| 712 | seen as a container of characters, offers one operation: write to |
---|
| 713 | back. Similarly, sin reads from front. Thus, they are ready to work |
---|
| 714 | against a pattern a | b | c, needing no more case refinement. The |
---|
| 715 | type sytem disambiguates <font face="Liberation Mono, monospace">sin|p</font> |
---|
| 716 | from <font face="Liberation Mono, monospace">sout|p</font>.</p> |
---|
| 717 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 718 | |
---|
| 719 | </p> |
---|
| 720 | <table width="453" cellpadding="4" cellspacing="0"> |
---|
| 721 | <col width="208"> |
---|
| 722 | <col width="105"> |
---|
| 723 | <col width="116"> |
---|
| 724 | <tr valign="top"> |
---|
| 725 | <td width="208" style="border: none; padding: 0cm"> |
---|
| 726 | <p><br/> |
---|
| 727 | |
---|
| 728 | </p> |
---|
| 729 | </td> |
---|
| 730 | <td width="105" style="border: none; padding: 0cm"> |
---|
| 731 | <p align="center">read (aka parse)</p> |
---|
| 732 | </td> |
---|
| 733 | <td width="116" style="border: none; padding: 0cm"> |
---|
| 734 | <p align="center">write</p> |
---|
| 735 | </td> |
---|
| 736 | </tr> |
---|
| 737 | <tr> |
---|
| 738 | <td width="208" style="border: none; padding: 0cm"> |
---|
| 739 | <p align="right">in forward linguistic time order</p> |
---|
| 740 | </td> |
---|
| 741 | <td width="105" valign="top" style="border-top: 1px solid #000000; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0.1cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 742 | <p align="center" style="margin-bottom: 0.5cm">split from front</p> |
---|
| 743 | <p align="center">(sin does this)</p> |
---|
| 744 | </td> |
---|
| 745 | <td width="116" valign="top" style="border: 1px solid #000000; padding: 0.1cm"> |
---|
| 746 | <p align="center" style="margin-bottom: 0.5cm">append</p> |
---|
| 747 | <p align="center">(sout does this)</p> |
---|
| 748 | </td> |
---|
| 749 | </tr> |
---|
| 750 | <tr> |
---|
| 751 | <td width="208" style="border: none; padding: 0cm"> |
---|
| 752 | <p align="right">in reverse linguistic time order</p> |
---|
| 753 | </td> |
---|
| 754 | <td width="105" valign="top" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: none; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0cm"> |
---|
| 755 | <p align="center">split from back</p> |
---|
| 756 | </td> |
---|
| 757 | <td width="116" valign="top" style="border-top: none; border-bottom: 1px solid #000000; border-left: 1px solid #000000; border-right: 1px solid #000000; padding-top: 0cm; padding-bottom: 0.1cm; padding-left: 0.1cm; padding-right: 0.1cm"> |
---|
| 758 | <p align="center">prepend</p> |
---|
| 759 | </td> |
---|
| 760 | </tr> |
---|
| 761 | </table> |
---|
| 762 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 763 | |
---|
| 764 | </p> |
---|
| 765 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 766 | |
---|
| 767 | </p> |
---|
| 768 | <p style="margin-bottom: 0cm; line-height: 100%"><font color="#000000">A |
---|
| 769 | string user needs to specify which behaviour is desired (<font face="Liberation Mono, monospace">myStr|p</font> |
---|
| 770 | is not enough). This choice, happening at the top level, coincides |
---|
| 771 | with the need to pick a syntax for looping (strawmanned above as |
---|
| 772 | while-nextMatch). This work is in progress; elements in |
---|
| 773 | consideration include:</font></p> |
---|
| 774 | <ul> |
---|
| 775 | <li/> |
---|
| 776 | <p style="margin-bottom: 0cm; line-height: 100%"><font color="#000000">++ |
---|
| 777 | with <, vs -- with >, for move/has-next, in forward/reverse |
---|
| 778 | order</font></p> |
---|
| 779 | <ul> |
---|
| 780 | <li/> |
---|
| 781 | <p style="margin-bottom: 0cm; line-height: 100%"><font color="#000000">plays |
---|
| 782 | nice with for loop, but confuses s > i overloading</font></p> |
---|
| 783 | </ul> |
---|
| 784 | <li/> |
---|
| 785 | <p style="margin-bottom: 0cm; line-height: 100%"><font color="#000000">unary |
---|
| 786 | - and + for read-from/write-to</font></p> |
---|
| 787 | <li/> |
---|
| 788 | <p style="margin-bottom: 0cm; line-height: 100%"><font color="#000000">unary |
---|
| 789 | ~ (or !) to switch to reverse linguistic order from default forward</font></p> |
---|
| 790 | <li/> |
---|
| 791 | <p style="margin-bottom: 0cm; line-height: 100%"><font color="#000000">top-level |
---|
| 792 | only: >> for read-from; << for write-to</font></p> |
---|
| 793 | </ul> |
---|
| 794 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 795 | |
---|
| 796 | </p> |
---|
| 797 | <p style="margin-bottom: 0cm; line-height: 100%">When reading from |
---|
| 798 | standard-in, automatically trimming whitespace is generally desired. |
---|
| 799 | When processing a string (and presuming to obviate an index-based |
---|
| 800 | API), it must be possible to take control of whitespace. Auto-newline |
---|
| 801 | behaviour is similar.</p> |
---|
| 802 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 803 | |
---|
| 804 | </p> |
---|
| 805 | <p style="margin-bottom: 0cm; line-height: 100%">Idea is:</p> |
---|
| 806 | <pre class="western" style="margin-bottom: 0.5cm">void ?{}(pat &, int &) // construct pattern from int reference</pre> |
---|
| 807 | <ul> |
---|
| 808 | <li/> |
---|
| 809 | <p style="margin-bottom: 0cm; line-height: 100%">gets |
---|
| 810 | overridden: multiple definitions of the symbol are out there</p> |
---|
| 811 | <li/> |
---|
| 812 | <p style="margin-bottom: 0cm; line-height: 100%">the default |
---|
| 813 | one is scope-visible, at background level, upon “#include string”</p> |
---|
| 814 | <li/> |
---|
| 815 | <p style="margin-bottom: 0cm; line-height: 100%">user may |
---|
| 816 | elevate a different one to current level by: <font face="Liberation Mono, monospace">with |
---|
| 817 | (stringopts.picky) {...}</font></p> |
---|
| 818 | </ul> |
---|
| 819 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 820 | |
---|
| 821 | </p> |
---|
| 822 | <p style="margin-bottom: 0cm; line-height: 100%">Illustration without |
---|
| 823 | an SPI, and covering the cases we care about:</p> |
---|
| 824 | <ul> |
---|
| 825 | <li/> |
---|
| 826 | <p style="margin-bottom: 0cm; line-height: 100%">Default</p> |
---|
| 827 | <ul> |
---|
| 828 | <li/> |
---|
| 829 | <p style="margin-bottom: 0cm; line-height: 100%">input |
---|
| 830 | spelling is base-10</p> |
---|
| 831 | <li/> |
---|
| 832 | <p style="margin-bottom: 0cm; line-height: 100%">Be |
---|
| 833 | aggressive about clearing whitespace, lax about its absence; |
---|
| 834 | adjacent whitespaces are insignificant</p> |
---|
| 835 | <li/> |
---|
| 836 | <p style="margin-bottom: 0cm; line-height: 100%">all |
---|
| 837 | contiguous [0-9] into the int; panic on overflow</p> |
---|
| 838 | <li/> |
---|
| 839 | <p style="margin-bottom: 0cm; line-height: 100%">require at |
---|
| 840 | least one [0-9] |
---|
| 841 | </p> |
---|
| 842 | <li/> |
---|
| 843 | <p style="margin-bottom: 0cm; line-height: 100%">yadda yadda |
---|
| 844 | leading zeros, atoi-consistent</p> |
---|
| 845 | </ul> |
---|
| 846 | <li/> |
---|
| 847 | <p style="margin-bottom: 0cm; line-height: 100%">Picky</p> |
---|
| 848 | <ul> |
---|
| 849 | <li/> |
---|
| 850 | <p style="margin-bottom: 0cm; line-height: 100%">Don’t |
---|
| 851 | touch whitespace</p> |
---|
| 852 | <li/> |
---|
| 853 | <p style="margin-bottom: 0cm; line-height: 100%">require |
---|
| 854 | exactly one [0-9], no coalescing</p> |
---|
| 855 | </ul> |
---|
| 856 | </ul> |
---|
| 857 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 858 | |
---|
| 859 | </p> |
---|
| 860 | <p style="margin-bottom: 0cm; line-height: 100%">Probably, a |
---|
| 861 | character-level SPI is required, to enable extensibility.</p> |
---|
| 862 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 863 | |
---|
| 864 | </p> |
---|
| 865 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 866 | |
---|
| 867 | </p> |
---|
| 868 | <h1 class="western">Open Binder design</h1> |
---|
| 869 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 870 | |
---|
| 871 | </p> |
---|
| 872 | <p style="margin-bottom: 0cm; line-height: 100%">This design |
---|
| 873 | addresses internals hidden by the string API.</p> |
---|
| 874 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 875 | |
---|
| 876 | </p> |
---|
| 877 | <p style="margin-bottom: 0cm; line-height: 100%">All depicted |
---|
| 878 | references into a string are by byte location.</p> |
---|
| 879 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 880 | |
---|
| 881 | </p> |
---|
| 882 | <p style="margin-bottom: 0cm; line-height: 100%">The name suggests a |
---|
| 883 | three-ring binder of papers, sitting opened to a middle page, with |
---|
| 884 | the rings un-clasped. It is easy to insert or delete at the current |
---|
| 885 | opened-to point, given the expense that data movement is required to |
---|
| 886 | advance this current point, proportional to the distance moved.</p> |
---|
| 887 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 888 | |
---|
| 889 | </p> |
---|
| 890 | <p style="margin-bottom: 0cm; line-height: 100%">We are optimizing |
---|
| 891 | for a single iteration through a string, in which substantial |
---|
| 892 | rewriting is happening at the iterator’s current point.</p> |
---|
| 893 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 894 | |
---|
| 895 | </p> |
---|
| 896 | <p style="margin-bottom: 0cm; line-height: 100%">Suppose we have:</p> |
---|
| 897 | <pre class="western">1 string s, s1, s2; |
---|
| 898 | 2 s = "abcdefghijklmnopqrstuvwxyz"; |
---|
| 899 | 3 [s1, s2] = exclude(s, 'k'); // s1=="abcdefghij", s2=="klmnopqrstuvwxyz" |
---|
| 900 | 4 s1 += "xxx"; // s =="abcdefghijxxxklmnopqrstuvwxyz"</pre><p style="margin-bottom: 0cm; line-height: 100%"> |
---|
| 901 | These objects can be represented by the buffers following, where the |
---|
| 902 | __ underscores represent don’t-care bytes.</p> |
---|
| 903 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 904 | |
---|
| 905 | </p> |
---|
| 906 | <p style="margin-bottom: 0cm; line-height: 100%">After line 2:</p> |
---|
| 907 | <pre class="western" style="margin-bottom: 0.5cm"> _________abcdefghijklmnopqrstuvwxyz</pre><p style="margin-bottom: 0cm; line-height: 100%"> |
---|
| 908 | After line 3:</p> |
---|
| 909 | <pre class="western" style="margin-bottom: 0.5cm"> abcdefghij_________klmnopqrstuvwxyz</pre><p style="margin-bottom: 0cm; line-height: 100%"> |
---|
| 910 | After line 4:</p> |
---|
| 911 | <pre class="western" style="margin-bottom: 0.5cm"> abcdefghijxxx______klmnopqrstuvwxyz</pre><p style="margin-bottom: 0cm; line-height: 100%"> |
---|
| 912 | <br/> |
---|
| 913 | |
---|
| 914 | </p> |
---|
| 915 | <p style="margin-bottom: 0cm; line-height: 100%">A sub-string is |
---|
| 916 | implemented as</p> |
---|
| 917 | <ul> |
---|
| 918 | <li/> |
---|
| 919 | <p style="margin-bottom: 0cm; line-height: 100%">having a pair |
---|
| 920 | of references into the buffer (start-byte, end-byte)</p> |
---|
| 921 | <li/> |
---|
| 922 | <p style="margin-bottom: 0cm; line-height: 100%">being in a |
---|
| 923 | linked list that incudes all active sub-strings of the buffer, |
---|
| 924 | ordered by start position</p> |
---|
| 925 | <li/> |
---|
| 926 | <p style="margin-bottom: 0cm; line-height: 100%">being in a |
---|
| 927 | similar list by end positon</p> |
---|
| 928 | <li/> |
---|
| 929 | <p style="margin-bottom: 0cm; line-height: 100%">knowing that |
---|
| 930 | a special element from the substrings’ lists marks the edit gap |
---|
| 931 | (or a is-editable/has-edited state on an iterator, if supporting |
---|
| 932 | multiple edit locations</p> |
---|
| 933 | </ul> |
---|
| 934 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 935 | |
---|
| 936 | </p> |
---|
| 937 | <p style="margin-bottom: 0cm; line-height: 100%">The string buffer |
---|
| 938 | implements automatically growing/shrinking the gap, by reallocating |
---|
| 939 | at a different size and fixing the iterators.</p> |
---|
| 940 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 941 | |
---|
| 942 | </p> |
---|
| 943 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 944 | |
---|
| 945 | </p> |
---|
| 946 | <h1 class="western">Lit Review to Include</h1> |
---|
| 947 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 948 | |
---|
| 949 | </p> |
---|
| 950 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 951 | |
---|
| 952 | </p> |
---|
| 953 | <p style="margin-bottom: 0cm; line-height: 100%">API’s approach to |
---|
| 954 | UTF-8 and indexing in:</p> |
---|
| 955 | <ul> |
---|
| 956 | <li/> |
---|
| 957 | <p style="margin-bottom: 0cm; line-height: 100%">Go</p> |
---|
| 958 | <li/> |
---|
| 959 | <p style="margin-bottom: 0cm; line-height: 100%">Rust</p> |
---|
| 960 | <li/> |
---|
| 961 | <p style="margin-bottom: 0cm; line-height: 100%">std::string</p> |
---|
| 962 | <li/> |
---|
| 963 | <p style="margin-bottom: 0cm; line-height: 100%">alternate |
---|
| 964 | proposals for Java at BMP-exit JSR</p> |
---|
| 965 | <ul> |
---|
| 966 | <li/> |
---|
| 967 | <p style="margin-bottom: 0cm; line-height: 100%">show these |
---|
| 968 | are back-compat challenges unique to java that we can get around</p> |
---|
| 969 | <li/> |
---|
| 970 | <p style="margin-bottom: 0cm; line-height: 100%">still, |
---|
| 971 | position wrt c-compat</p> |
---|
| 972 | </ul> |
---|
| 973 | <li/> |
---|
| 974 | <p style="margin-bottom: 0cm; line-height: 100%">(find some |
---|
| 975 | super-high-level, text-processing DSL... what does it do?)</p> |
---|
| 976 | <ul> |
---|
| 977 | <li/> |
---|
| 978 | <p style="margin-bottom: 0cm; line-height: 100%">big data / |
---|
| 979 | NLP ??</p> |
---|
| 980 | </ul> |
---|
| 981 | </ul> |
---|
| 982 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 983 | |
---|
| 984 | </p> |
---|
| 985 | <p style="margin-bottom: 0cm; line-height: 100%">Existing |
---|
| 986 | char*-implemented algorithms</p> |
---|
| 987 | <ul> |
---|
| 988 | <li/> |
---|
| 989 | <p style="margin-bottom: 0cm; line-height: 100%">find some</p> |
---|
| 990 | <li/> |
---|
| 991 | <p style="margin-bottom: 0cm; line-height: 100%">ensure the |
---|
| 992 | table-implementation for substring match features in my |
---|
| 993 | exact-substring pattern</p> |
---|
| 994 | <li/> |
---|
| 995 | <p style="margin-bottom: 0cm; line-height: 100%">clarify |
---|
| 996 | utf8-agnosticism</p> |
---|
| 997 | <li/> |
---|
| 998 | <p style="margin-bottom: 0cm; line-height: 100%">case study |
---|
| 999 | for promoting / how-to</p> |
---|
| 1000 | <li/> |
---|
| 1001 | <p style="margin-bottom: 0cm; line-height: 100%">“client ABC |
---|
| 1002 | should convert their RDBMS to CFA”</p> |
---|
| 1003 | <li/> |
---|
| 1004 | <p style="margin-bottom: 0cm; line-height: 100%">getopt for |
---|
| 1005 | command-line arguments (thanks Thierry for the example)</p> |
---|
| 1006 | <ul> |
---|
| 1007 | <li/> |
---|
| 1008 | <p style="margin-bottom: 0cm; line-height: 100%">case of it |
---|
| 1009 | reordering argv to do names then positionals; this is how gcc does |
---|
| 1010 | mixed</p> |
---|
| 1011 | </ul> |
---|
| 1012 | </ul> |
---|
| 1013 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 1014 | |
---|
| 1015 | </p> |
---|
| 1016 | <p style="margin-bottom: 0cm; line-height: 100%">Typical regex |
---|
| 1017 | implementation algorithms</p> |
---|
| 1018 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 1019 | |
---|
| 1020 | </p> |
---|
| 1021 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 1022 | |
---|
| 1023 | </p> |
---|
| 1024 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 1025 | |
---|
| 1026 | </p> |
---|
| 1027 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 1028 | |
---|
| 1029 | </p> |
---|
| 1030 | <p style="margin-bottom: 0cm; line-height: 100%"><br/> |
---|
| 1031 | |
---|
| 1032 | </p> |
---|
| 1033 | </body> |
---|
| 1034 | </html> |
---|