<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">New Spitball</div><div class=""><br class=""></div><div class="">But first:</div><div class=""><br class=""></div><div class="">C has one of the worst array presentation models. It has traumatized so many that those among them that grew up to be language designers themselves threw out fixed-sized arrays entirely (from Java to even current Swift!). But we’re getting through to everyone that the concept is still important, no matter how bad one realization of it is.</div><div class=""><br class=""></div><div class="">* If you could to arrays over, why limit your indexes to 0 ..&lt; COUNT, when you could use any range by subtracting an offset first</div><div class="">* Once you do that, why limit yourself to Int, when anything that could be implemented as an Int (like an enumeration type) would also work.</div><div class=""><br class=""></div><div class="">The whole point of adding types is abstraction. If you are modeling a table where the coordinates are an enumeration, why not let the language to the translation for you. There’s no need for just a Swift-y version of C’s array model. (Already Swift downplays pointers, so the “arrays are pointers with funny settings” part of the C model shouldn’t be carried over.)</div><div class=""><br class=""></div><div class="">This isn’t a new concept; while C’s successors gave up, C’s contemporaries didn’t. There’s plenty of models to base array presentation on. Looking at an Ada page recently, I realized that I must have let my previous experience shape the keywords I chose.</div><div class=""><br class=""></div><div class="">Now back to Spitball #3:</div><div class=""><br class=""></div><div class="">New Keywords:</div><div class="">* of</div><div class="">* #indexOf</div><div class="">* #flatten</div><div class=""><br class=""></div><div class="">Static Array Directive:</div><div class="">* “[“ Specifiers_opt “of” type “]”</div><div class="">* Specifiers: Specifier | Specifier “,” Specifiers</div><div class="">* Specifier: Extent-Range Storage-Rank_opt</div><div class="">* Extent-Range: Low … High | Low ..&lt; High | N (for 0 ..&lt; N) | Enum-Type (for Enum.min … Enum.max)</div><div class="">* Storage-Rank: Integer in 0 ..&lt; ExtentCount; use smallest unused value if missing; all values must be used exactly once</div><div class="">* “mutating” (or “nonmutating”) can precede the type if the directive is used for an array-segment reference</div><div class=""><br class=""></div><div class="">Immediate Array: Use Static Array Directive with at least one extent</div><div class=""><br class=""></div><div class="">Array-Segment Reference: Use Static Array Directive with no extents</div><div class="">* can initialize a scoped reference with an array literal, but the reference must be in “let” mode (so you can’t reseat it and lose the only reference to the array)</div><div class="">* If you use this construct, put in a “mutating” to let the elements be changeable if needed</div><div class="">* This will let you use a C-like “let myArray: [of mutating Int] = [1, 2, 3, 4, 6]” without counting first, like “var myArray: [5 of Int] = [1, 2, 3, 4, 6]” would need</div><div class=""><br class=""></div><div class="">Nominal Arrays: Use “struct” with a Static Array Directive as the base type; mutually exclusive with instance-level stored properties (Having neither is OK.)</div><div class="">* The “subscript” definition allows zero parameters, but “[]” doesn’t allow zero arguments, so use “myArray.super” to get the inner singular value in this case</div><div class="">* Swift allows “self” by itself, but not “super”. This will have to be changed.</div><div class=""><br class=""></div><div class="">For loops:</div><div class="">* Array-segment references conform to RandomAccessCollection (and possibly MutableCollection); the two definitive array types don’t</div><div class="">* For loops will work for the definitive array types anyway</div><div class="">* We should either define iteration in storage order or let it be implementation-defined</div><div class="">* We should have some other syntax to let processing of elements go in parallel</div><div class="">* Within a for-loop, use “#indexOf(X)” to get a tuple of the index coordinates of the current element; “X” is (one of) the iteration objects between the “for” and “in”; an identifier is needed so if you have nested for-loops with separate arrays, you can choose which one to inspect</div><div class=""><br class=""></div><div class="">Dereferencing:</div><div class="">* For immediate arrays, use "myArray.0" like tuples, it’s "myArray.(1, 2)" for multi-dimensional arrays</div><div class="">* Convert to array-segment first if you need run-time index selection (with “[]”)</div><div class="">* Nominal arrays come with “[]” by default</div><div class=""><br class=""></div><div class="">Function arguments:</div><div class="">* Use array-segment reference parameter to take definitive arrays of any size, assuming the same element type</div><div class="">* If the definitive array is multi-dimensional, use “#flatten(myArray)” first (I’ve realized that a multi-D array should not translate to a linear ASR silently by default.)</div><div class="">* Of course, you can use either definitive array type as a parameter too</div><div class=""><br class=""></div><div class="">
<div style="color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">—&nbsp;</div><div class="">Daryle Walker<br class="">Mac, Internet, and Video Game Junkie<br class="">darylew AT mac DOT com&nbsp;</div></div>
</div>
<br class=""></body></html>