> On Mar 1, 2017, at 12:59 PM, Dave Abrahams via swift-evolution
> <[email protected]> wrote:
>
>
> on Wed Mar 01 2017, Douglas Gregor <[email protected]
> <mailto:[email protected]>> wrote:
>
>>> On Mar 1, 2017, at 1:55 AM, Jonathan Hull <[email protected]> wrote:
>>>
>>> What I would like is a way to specialize a generic function in a block of
>>> code: (Strawman syntax)
>>>
>>> if T is Int.self {
>>> //In this block of code T == Int
>>> }
>>>
>>> It seems to me that the compiler might even be able to optimize this
>>> without a branch. If there
>> is a return in the block, then it might even be able to throw away all the
>> code after it for the Int
>> version of the function.
>>
>> We’ve been calling this “type refinement”. Essentially, within some
>> lexical context (the “if” here) we can assert additional properties on
>> a type or one specific (constant) values and take advantage of those
>> properties, as you’ve done with T == Int.
>>
>> It’s a plausible language feature, and could be useful. There’s
>> certainly some precedent for it: C++17 adds something similar with
>> “constexpr if”, albeit in their non-separately-type-checked template
>> instantiation model.
>>
>> It’s a nontrivial language feature that’s well out of scope for Swift 4.
>
> Huh? This totally works:
>
> extension Optional {
>
> func goo() -> Int {
> return Wrapped.self is Int.Type ? 1 : 0
> }
>
> }
>
> func rue() -> Int {
> return (nil as Bool?).goo() + (nil as Int?).goo()
> }
>
> /* rue optimizes down to:
>
> .private_extern __TF1x3rueFT_Si
> .globl __TF1x3rueFT_Si
> .p2align 4, 0x90
> __TF1x3rueFT_Si:
> pushq %rbp
> movq %rsp, %rbp
> movl $1, %eax
> popq %rbp
> retq
> */
>
> print(rue())
>
> What am I missing?
In a context where “T == Int”, I’d expect to be able to write code that depends
on that assumption:
func f<T>(a1: [T]) {
var a2 = a1
if where T == Int { /* crazy syntax, I know */
a2.append(1) // fine, because T == Int
}
}
- Doug
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution