> On Feb 8, 2017, at 12:33 AM, Slava Pestov <spes...@apple.com> wrote:
>> On Feb 7, 2017, at 9:30 PM, Jacob Bandes-Storch <jtban...@gmail.com 
>> <mailto:jtban...@gmail.com>> wrote:
>> 
>> Thanks to the magic of git blame:
>> 
>>   
>> https://github.com/apple/swift/commit/f3ed7e93e142b802171bfe0dd08b88aa0d8b320b
>>  
>> <https://github.com/apple/swift/commit/f3ed7e93e142b802171bfe0dd08b88aa0d8b320b>
>> 
>> 
>> > Unless you think there’s something to be gained, I’m not sure it’s worth 
>> > it…
>> 
>> I was going for idiot-proof-ness of the AST types. I'd never heard of 
>> CaptureListExpr before and would've just assumed it was part of ClosureExpr. 
>> But it looks like the change was pretty intentional. (Maybe someone can 
>> share what rdar://19146761 <rdar://19146761> was?)
> 
> "This crashes the compiler, we’re not setting up declcontext’s right:
> 
> func f(a : () -> ()) {}
> 
> class C {
>   var i = 42
> 
>   func g() {
>     f({ [myI = {i}] in () })
>   }
> }"

Well that certainly doesn't seem like a good enough reason to complicate the 
expression.

...are we really emitting this as a let-binding in the outer function that we 
just capture normally?  Er, alright, I guess it works.

John.

> 
>> 
>> On Tue, Feb 7, 2017 at 9:27 PM, John McCall <rjmcc...@apple.com 
>> <mailto:rjmcc...@apple.com>> wrote:
>>> On Feb 8, 2017, at 12:18 AM, Jacob Bandes-Storch via swift-dev 
>>> <swift-dev@swift.org <mailto:swift-dev@swift.org>> wrote:
>>> I don't think it would be a very big parser change to invert the 
>>> relationship. Maybe I'll try it out and put up another PR.
>>> 
>>> On the other hand, noticed the header comment says:
>>> 
>>> /// ...Because the capture list is evaluated outside of the closure, this
>>> /// CaptureList wraps the ClosureExpr.  The dynamic semantics are that 
>>> evaluates
>>> /// the variable bindings from the capture list, then evaluates the
>>> /// subexpression (the closure itself) and returns the result.
>> 
>> I think the original representation just made the captures part of the 
>> ClosureExpr, and IIRC Chris changed it to this intentionally.  I don't 
>> remember why; maybe it was causing problems for some tooling that wanted to 
>> walk the expression tree and find uses of the variable?  It's certainly 
>> kindof weird for IRGen.
>> 
>> John.
>> 
>>> 
>>> 🤷‍
>>> 
>>> On Tue, Feb 7, 2017 at 9:10 PM, Slava Pestov <spes...@apple.com 
>>> <mailto:spes...@apple.com>> wrote:
>>> 
>>>> On Feb 7, 2017, at 9:09 PM, Jacob Bandes-Storch <jtban...@gmail.com 
>>>> <mailto:jtban...@gmail.com>> wrote:
>>>> 
>>>> PR'd:  https://github.com/apple/swift/pull/7326 
>>>> <https://github.com/apple/swift/pull/7326>
>>>> 
>>>> Although I would also ask: why is CaptureListExpr a parent of ClosureExpr 
>>>> and not a child?
>>> 
>>> I think it’s kind of arbitrary. You could also argue that they should be 
>>> one and the same AST node. I think right now it’s just a property of how 
>>> the parser works, the capture list comes first, before the closure body?
>>> 
>>> Slava
>>> 
>>>> 
>>>> Jacob
>>>> 
>>>> On Tue, Feb 7, 2017 at 7:56 PM, Slava Pestov <spes...@apple.com 
>>>> <mailto:spes...@apple.com>> wrote:
>>>> 
>>>>> On Feb 7, 2017, at 7:30 PM, Jacob Bandes-Storch via swift-dev 
>>>>> <swift-dev@swift.org <mailto:swift-dev@swift.org>> wrote:
>>>>> 
>>>>> I just learned about CaptureListExpr when working on some diagnostics. Is 
>>>>> there a particular reason that its member "closureBody" is an Expr* and 
>>>>> not a ClosureExpr*? There seems to be only one place it's built 
>>>>> <https://github.com/apple/swift/blob/1e46f13184d7256c991b2ba9424af9efe3cd860f/lib/Parse/ParseExpr.cpp#L2425>,
>>>>>  and the body is always a ClosureExpr.
>>>>> 
>>>>> I can see one minor place 
>>>>> <https://github.com/apple/swift/blob/1e46f13184d7256c991b2ba9424af9efe3cd860f/lib/AST/ASTWalker.cpp#L663-L665>
>>>>>  where it might be less convenient to have a ClosureExpr, but otherwise 
>>>>> there doesn't seem to be much of a reason to keep it generalized to Expr*.
>>>> 
>>>> Since autoclosures cannot have capture lists, I think the change you’re 
>>>> suggesting makes sense.
>>>> 
>>>> Slava
>>>> 
>>>>> 
>>>>> Jacob
>>>>> _______________________________________________
>>>>> swift-dev mailing list
>>>>> swift-dev@swift.org <mailto:swift-dev@swift.org>
>>>>> https://lists.swift.org/mailman/listinfo/swift-dev 
>>>>> <https://lists.swift.org/mailman/listinfo/swift-dev>
>>>> 
>>>> 
>>> 
>>> 
>>> _______________________________________________
>>> swift-dev mailing list
>>> swift-dev@swift.org <mailto:swift-dev@swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-dev 
>>> <https://lists.swift.org/mailman/listinfo/swift-dev>
>> 
>> 
> 

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

Reply via email to