> On 3. Aug 2017, at 07:26, John McCall <rjmcc...@apple.com> wrote:
> 
>> On Aug 3, 2017, at 12:45 AM, Daryle Walker <dary...@mac.com 
>> <mailto:dary...@mac.com>> wrote:
>>> On Aug 2, 2017, at 4:44 PM, Karl Wagner via swift-evolution 
>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>> 
>>> I’m -1 on adding a fixed-sized Array type.
>>> 
>>> It goes back to something which I remember reading from John McCall earlier 
>>> this week but can’t find any more: about tuple indices being nominal and 
>>> not ordinal. How do fixed-size Arrays differ? Are their indexes truly not 
>>> nominal?
>> 
>> I think he meant that the numbered names for tuple members were originally 
>> (?) there because the Swift authors didn’t mandate each member needing a 
>> label, so there needed some way to refer to unnamed members. Note that 
>> numbered names are not true integer variables, not even useable as such. 
>> Array indexes are programmable objects; algorithms on the indexes is how we 
>> select array subsets to apply algorithms

I’m not saying that tuple member names are “true integers” (although, with 
Reflection…). I understood that, semantically, the reason we refer to elements 
.0, .1 and .2 of a tuple because that’s their name, not necessarily because its 
their position in the tuple. My point is that for a fixed-size array like a [3; 
Double] vector, because you know what to expect at each location, those indices 
are *both* ordinal *and* nominal. Subscripting [0] or [1] from that FSA has the 
same conceptual meaning as accessing .x or .y on an equivalent struct. What I’m 
trying to say is: for a FSA, the index *is* the member name, just like the 
declaration-order number is for tuples.

> 
> Yes, essentially.  I was making this argument on a slightly higher level, 
> just thinking about the meaning of values separate from any syntax.
> 
> A fixed-sized array is still fundamentally an array: it's a sequence of 
> homogenous elements, where relative positions generally have some level of 
> meaning.  In an array like [A,B,C,D], it's probably *significant* that A 
> comes first and that C comes before D.  On some level, if it wasn't true that 
> the order was significant, it wouldn't "really" be an array, it would be a 
> set (or multiset) being represented using an array.

I think the difference is that, for a fixed-size Array, the absolute positions 
also generally have external meaning which is known to the programmer but not 
reflected in the type-system. For example, that a [3; Double] vector is 
supposed to be interpreted as (x, y, z) components, in that order.

We can do better than to expose a 3-element vector as a list of 3 unlabelled 
values. Or even a n-dimensional matrix just as a series of numbers. A better 
system may require meta-programming features we don’t support yet, and that’s 
fine, but I would really like us to focus on the actual use-cases of FSAs and 
to consider ways of making those great, rather than checking off a feature that 
we have to have ‘just because’.

> 
> In contrast, a tuple is more like a jumble of independent values, ordered 
> only because in this benighted world we can't really write them down at the 
> same time. If you know someone's name and age, and you have to scribble them 
> both down on a piece of paper, it doesn't really change anything which one 
> you write first.  At most there's some arbitrary convention for the order, 
> like putting x before y in Cartesian coordinates.
> 
> We can choose different types for different purposes because they convey 
> different things about the values they store.  Isomorphism is not meaning.
> 
>>> The difference between a fixed-size array and the dynamically-sized Array 
>>> we already have is that the programmer expects specific data at each 
>>> element. Maybe it’s elements of a vector or matrix, or some other 
>>> structure, but in general I think that constraints about the size/shape of 
>>> the sequence implies expectations about what you’re going to find at each 
>>> location. Maybe you would normally write a struct for it, but it’s not 
>>> worth writing out. In that sense, how is it different from a homogenous 
>>> tuple?
>> 
>> I’m not sure what you mean here. How do elements of dynamically-sized arrays 
>> not have expectations?
>> 
>> The big innovation arrays (and loops) brought was no longer having a 
>> per-sub-object declaration/command for elements. Just tweak a number.
>> 
>> I’m not good at explicit explanations, so having to justify adding a type 
>> that’s been around for a long time (at least FORTRAN 4+ decades ago) an 
>> almost every systems programming language has is frustrating. I thought the 
>> desire would be obvious; if there were FSAs in Swift 1, would there be any 
>> “just slap Collection on tuples and be done with it” suggestions now? It 
>> doesn’t help that I still don’t know why FSAs where skipped in Swift 1; did 
>> they forget or was there some high-level type-theory reason? (Were the type 
>> description records in the Swift ABI too fragile for a type that wouldn’t 
>> have per-sub-object entries (assuming theoretical Swift-1-FSAs weren’t 
>> translated to massive homogenous tuples)?)
> 
> They just weren't a priority.  There are many things I wish we had done more 
> work on before we released Swift 1, but trying to perfectly represent 
> everything in C type system is not one of them.
> 
> Reasons not to prioritize fixed-sized arrays:
> 1. Variably-sized arrays are a much more important data structure.  Fixed 
> sized arrays are easier to make perform well, but they are inflexible and 
> only narrowly useful.
> 2. The bound introduces significant expressional complexity to the type 
> system.  What types are eligible as bounds?  What sorts of inference and 
> meta-programming are possible on bounds? etc.
> 3. The language/library interactions are complex.  It's a general data 
> structure that demands proper integration with the rest of the collections 
> library, but the language also really needs to hard-code an exact 
> representation.  So it would take a lot of work to integrate.
> 
> Honestly, a lot of this still applies.  I would like to see fixed-sized 
> arrays in the language eventually, but they are not going to become a 
> priority, because there's a lot of other stuff that is more important to work 
> on.

I remember that in the first Swift beta, you were allowed to mutate a “let” 
Array as long as you didn’t change its length. The community didn’t like it and 
things moved to COW instead.

> 
> John.
> 
>> 
>> I mentioned in my proposal that no language (that I know of) splatted tuple 
>> and array syntax together, either declaration syntax or dereferencing 
>> syntax. (Lua has shared dereferencing syntax, but they both rip-off 
>> dictionaries.) Where do people think every one else over the last few 
>> decades went wrong?
>> 
>> Maybe there’s a copy of the FORTRAN design documents out there?...
>> 
>>> Also, what effect would this have on Array as the common-currency for 
>>> simple lists? And what about the literals - does [myObj, anotherObj] give 
>>> you a [MyObject] or a [2; MyObject]? Is that what users will intuitively 
>>> expect? What about if it’s a “let” constant?
>> 
>> Later revisions of the proposal have a distinct grid literal syntax, to 
>> clear up any potential confusion. The standard array literals would map to 
>> Array. The grid literal, which includes the dimensions of the array before a 
>> list of each value, would map to a fixed-size array.
>> 
>>> So overall, I’m unconvinced of the need for fixed-size arrays. My 
>>> counter-proposal would be a shorthand syntax for more conveniently defining 
>>> homogenous tuples, and keep them as our go-to objects for ad-hoc groups of 
>>> things. That’s it. If you would have used a fixed-size Array in C, keep 
>>> using homogenous tuples in Swift.
>>> 
>>> As for the part about the @vector and @parallel attributes, those would be 
>>> worth a separate proposal. As for @parallel, I suggested something like 
>>> that before but Dave Abrahams said any such support would look more like a 
>>> generic concurrent wrapper, e.g. 
>>> https://gist.github.com/karwa/43ae838809cc68d317003f2885c71572 
>>> <https://gist.github.com/karwa/43ae838809cc68d317003f2885c71572>. Vector 
>>> support is worth thinking about in a separate proposal.
>> 
>> A main point for my FSA design is that I want to allow the default iteration 
>> primitive (for-loop) to have a vectorized/parallel implementation (someday). 
>> Since Sequence/Collection always has a sequential traversal policy (It’s in 
>> the name!), it’s the main reason FSA don’t directly conform to Collection in 
>> the design.
>> 
>> — 
>> 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