> On Jul 23, 2017, at 12:04 PM, Taylor Swift <kelvin1...@gmail.com> wrote:
> 
> 
> 
> On Sun, Jul 23, 2017 at 3:08 AM, Daryle Walker <dary...@mac.com 
> <mailto:dary...@mac.com>> wrote:
> 
>> 9. I don’t see the value in having both nested FSAs and multi-dimensional 
>> FSAs. Aren’t they the same thing? For example, in the code snippet
> 
> Why does any language with multi-dimensional arrays (like Fortran or Ada) 
> have them? By this standard, no language should have multi-dimensional 
> arrays. They exist because of data modeling. Co-equal coordinates in the 
> model should be co-equal in their representation in the program. Yes, they 
> are implemented the same way underneath. We don’t copy C everywhere, so why 
> not take this opportunity to do better. Also, just using nesting could imply 
> that the intermediate array types have a meaning, but they might not if 
> they’re just implementation quirks and not part of the abstract model.
> 
> Nested arrays are not my solution for multi-coordinate indexing; use 
> multi-dimensional arrays for that. I mention nested arrays because:
> 
> Nested arrays fundamentally cannot be banned. (What if an element type is 
> hidden behind a type-alias and is conditionally an array type?)
> Doesn’t Swift have to resolve the types at some point anyway? If it’s 
> impossible to ban, we can allow it, but still make it unidiomatic. Nested 
> arrays are much messier to write than multidimensional arrays.

The new draft I’m writing downplays nested arrays a lot. They’re mentioned in 
the section discussing the core element type (nee the inner non-array type).

> I need the definition to explain the “inner non-array type”
> I need the inner non-array type to explain which pairings of FSAs for 
> reshaping are legal. (And a similar reason for tuple conversion.) Note the 
> two types can have different nesting levels.
> I need to explain that empty arrays cannot be an array element type. (Should 
> this be changed? What happens with tuples or structures containing empty 
> tuples/structures as members? What about empty tuples/sturctures in “Array”? 
> Banning empty arrays means we don’t have to worry about every array element 
> being at the same address. The other way to solve this is to make them one 
> byte (or word) long.)
> 
>> ```
>> let a = [;1, 2, 3, 4]
>> assert(a[0] == 1)
>> assert(a[1] == 2)
>> assert(a[2] == 3)
>> assert(a[3] == 4)
>> let b = a as [2, 2; Int]
>> assert(b[0, 0] == 1)
>> assert(b[0, 1] == 2)
>> assert(b[1, 0] == 3)
>> assert(b[1, 1] == 4)
>> let c = a as [2; [2; Int]]
>> assert(c[0][0] == 1)
>> assert(c[0][1] == 2)
>> assert(c[1][0] == 3)
>> assert(c[1][1] == 4)
>> ```
>> 
>> There’s three syntaxes which accomplish two unique things. I lean towards 
>> disallowing FSA nesting and instead allowing incomplete index lists to 
>> partially unnest multidimensional FSAs. Let’s reserve “[][][]...” for 
>> flexible array chained dereferencing.
> 
> I don’t understand what your incomplete index list idea is. And as I said, 
> the chaining technique is less I desire it and more I can’t ban it and keep 
> Swift features orthogonal.
> 
> Incomplete indexing means 
> 
> let fsa:[5, 2; Int] = [5, 2; 2, 4, 3, 5, 4, 6, 5, 7, 6, 8]
> fsa[3] // [2; 5, 7]
> 
> this would be the same as writing 
> 
> let fsa:[5; [2; Int]] = [5; [2; 2, 4], [2; 3, 5], [2; 4, 6], [2; 5, 7], [2; 
> 6, 8]]
> fsa[3] // [2; 5, 7]
>  
> in your current system. This would obviate the need to nest FSAs for the 
> purpose of extracting entire rows of data.

Allowing partial indexing as you show it privileges one dimension over the 
others, although they’re supposed to be co-equal and the reason a particular 
dimension is privileged is due to an implementation detail. Or would you allow 
incomplete indexing on other dimensions besides the first? Where the 
true-multi-dimensional <-> nested FSA equivalence wouldn’t help you (because 
the elements are dispersed in the whole array). With complete generics, this 
could be a library function:

func removeRow<Dimension: Int, M…: Int, N…: Int, P: Int, T>(array: […M, P, …N; 
T], row: Int) -> […M, …N; T] where #lengthof(M) == Dimension


> 
>> 11. This should have defined behavior:
>> 
>> let data = [2, 2; 1, 2, 4, 8]
>> for (i, x) in data.enumerated()
>> {
>>     total += x
>> }
> 
> FSAs are compound types, not named types, so there are no methods. (Just like 
> tuples, FSAs don’t follow any protocols.) But since they’re a built-in, I can 
> customize the “for-in” loop to cover all the elements in an 
> implementation-optimized order. (The implementation has the option of 
> multi-threading if it can see there’s no cross-iteration contamination.) 
> Since you can’t control the order without manual looping, the “#indexOf” 
> expression exists to let you know where you are during an iteration loop.
> 
> I first used the iteration variable as the operand to “#indexOf” to determine 
> which array instance to track. Then I saw that the for-loop implements its 
> iteration variable as a pattern in the grammar instead of something simpler. 
> And what happens if a wildcard is used as the iteration variable? And would 
> people question why when the pattern has multiple iteration variables, all 
> are equally valid for “#indexOf”? I moved the operand to be the label because 
> we usually don’t have multiple labels on statements (Is that even legal in 
> Swift?) and can optimize which loops need to be indexable.
> 
> I really dislike the addition of magical builtin variables. Iterating through 
> a FSA should just take the FSA down one dimension level, so
> 
> let data = [2, 3; 1, 2, 3, 4, 8, 12]
> for x:[3;] in data
> {
>     total += x[0] + x[1] + x[2]
> }
> 
> would be the pattern.

I’m assuming that automatic incomplete indexing would happen here, instead of a 
flat loop.

The point of the flat for-loop is to eliminate the drudgery of nesting 
per-dimension for-loops (and re-editing whenever a dimension value or the 
dimension count changes) and to let the implementation optimize traversal 
(especially if a processor vector type is used).

— 
Daryle Walker
Mac, Internet, and Video Game Junkie
darylew AT mac DOT com 

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to