On Jul 31, 2017, at 12:15 AM, Gor Gyolchanyan via swift-evolution <swift-evolution@swift.org> wrote:
>> On Jul 31, 2017, at 7:10 AM, John McCall via swift-evolution >> <swift-evolution@swift.org> wrote: >> >>> On Jul 30, 2017, at 11:43 PM, Daryle Walker <dary...@mac.com> wrote: >>> The parameters for a fixed-size array type determine the type's >>> size/stride, so how could the bounds not be needed during compile-time? The >>> compiler can't layout objects otherwise. >> >> Swift is not C; it is perfectly capable of laying out objects at run time. >> It already has to do that for generic types and types with resilient >> members. That does, of course, have performance consequences, and those >> performance consequences might be unacceptable to you; but the fact that we >> can handle it means that we don't ultimately require a semantic concept of a >> constant expression, except inasmuch as we want to allow users to explicitly >> request guarantees about static layout. > > Doesn't this defeat the purpose of generic value parameters? We might as well > use a regular parameter if there's no compile-time evaluation involved. In > that case, fixed-sized arrays will be useless, because they'll be normal > arrays with resizing disabled. As far as I know, the pinnacle of uses for > fixed-size arrays is having a compile-time pre-allocated space of the > necessary size (either literally at compile-time if that's a static variable, > or added to the pre-computed offset of the stack pointer in case of a local > variable). Not at all... it'd let us use non-type parameters to affect a value's type... The classic example (or at least the one that I keep typing out whenever the topic comes up) is vector matrix math: func * <T: Numeric, M: Integer, N: Integer, P: Integer> (lhs: Matrix<T, M, N>, rhs: Matrix<T, N, P>) -> Matrix<T, M, P> { // no need to check if the dimensions at runtime because the type system turned dimension mismatches into a compile-time error ... } Sticking with the math theme, if you can make the variable's name (that is, your package's variable type, not a Swift var or let) part of its type, I suspect there's a trick you could do in a symbolic manipulation library involving simplifying equations (but I haven't thought it through enough to say for sure). - Dave Sweeris _______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution