<html><head><style>
body {
        font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
        padding:1em;
        margin:auto;
        background:#fefefe;
}

h1, h2, h3, h4, h5, h6 {
        font-weight: bold;
}

h1 {
        color: #000000;
        font-size: 28pt;
}

h2 {
        border-bottom: 1px solid #CCCCCC;
        color: #000000;
        font-size: 24px;
}

h3 {
        font-size: 18px;
}

h4 {
        font-size: 16px;
}

h5 {
        font-size: 14px;
}

h6 {
        color: #777777;
        background-color: inherit;
        font-size: 14px;
}

hr {
        height: 0.2em;
        border: 0;
        color: #CCCCCC;
        background-color: #CCCCCC;
    display: inherit;
}

p, blockquote, ul, ol, dl, li, table, pre {
        margin: 15px 0;
}

a, a:visited {
        color: #4183C4;
        background-color: inherit;
        text-decoration: none;
}

#message {
        border-radius: 6px;
        border: 1px solid #ccc;
        display:block;
        width:100%;
        height:60px;
        margin:6px 0px;
}

button, #ws {
        font-size: 12 pt;
        padding: 4px 6px;
        border-radius: 5px;
        border: 1px solid #bbb;
        background-color: #eee;
}

code, pre, #ws, #message {
        font-family: Monaco;
        font-size: 10pt;
        border-radius: 3px;
        background-color: #F8F8F8;
        color: inherit;
}

code {
        border: 1px solid #EAEAEA;
        margin: 0 2px;
        padding: 0 5px;
}

pre {
        border: 1px solid #CCCCCC;
        overflow: auto;
        padding: 4px 8px;
}

pre > code {
        border: 0;
        margin: 0;
        padding: 0;
}

#ws { background-color: #f8f8f8; }


.bloop_markdown table {
border-collapse: collapse;  
font-family: Helvetica, arial, freesans, clean, sans-serif;  
color: rgb(51, 51, 51);  
font-size: 15px; line-height: 25px;
padding: 0; }

.bloop_markdown table tr {
border-top: 1px solid #cccccc;
background-color: white;
margin: 0;
padding: 0; }
     
.bloop_markdown table tr:nth-child(2n) {
background-color: #f8f8f8; }

.bloop_markdown table tr th {
font-weight: bold;
border: 1px solid #cccccc;
margin: 0;
padding: 6px 13px; }

.bloop_markdown table tr td {
border: 1px solid #cccccc;
margin: 0;
padding: 6px 13px; }

.bloop_markdown table tr th :first-child, table tr td :first-child {
margin-top: 0; }

.bloop_markdown table tr th :last-child, table tr td :last-child {
margin-bottom: 0; }

.bloop_markdown blockquote{
  border-left: 4px solid #dddddd;
  padding: 0 15px;
  color: #777777; }
  blockquote > :first-child {
    margin-top: 0; }
  blockquote > :last-child {
    margin-bottom: 0; }

code, pre, #ws, #message {
    word-break: normal;
    word-wrap: normal;
}

hr {
    display: inherit;
}

.bloop_markdown :first-child {
    -webkit-margin-before: 0;
}

code, pre, #ws, #message {
    font-family: Menlo, Consolas, Liberation Mono, Courier, monospace;
}


.send { color:#77bb77; }
.server { color:#7799bb; }
.error { color:#AA0000; }</style></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class="bloop_markdown"><p>I clearly disagree with your point. Autoclosure supposed to be a syntactically convenience feature to omit braces, which as a consequence needs to disable arguments. However it is not said that you cannot pass a closure with the same signature to the autoclosure, which currently is not possible unless it’s another autoclosure. This doesn’t feel right at all.</p>

<pre><code>func foo(_: @autoclosure () -&gt; Void) {}

func bar(_ test: @autoclosure () -&gt; Void) {
   foo(test) // works    
}

let closure: () -&gt; Void = {}

foo(closure) // error
</code></pre>

<p>Here is another example where autoclosure takes over and produces false result even when the correct overload is present but the resolution ends up picking an autoclosure.</p>

<pre><code>extension Bool {

    /// #1
    func whenTrue(execute closure: () -&gt; Void) {
        if self { closure() }
    }

    /// #2
    func whenTrue(execute closure: @autoclosure () -&gt; Void) {
        if self { closure() }
    }

    /// #3
    func whenTrue&lt;T&gt;(execute closure: @autoclosure () -&gt; T) -&gt; T? {
        if self { return closure() }
        return nil
    }
}

let test: () -&gt; Void = { }
// #3 wins and produces a wrong type () -&gt; (() -&gt; Void)?, but I expect #1 here
// () -&gt; Void?
true.whenTrue(execute: test)  
</code></pre>

<p>A syntactical convenience feature should not disable explicitness!</p>

<p></p></div><div class="bloop_original_html"><style>body{font-family:Helvetica,Arial;font-size:13px}</style><div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px; color: rgba(0,0,0,1.0); margin: 0px; line-height: auto;"><br></div> <br> <div id="bloop_sign_1498946931420032000" class="bloop_sign"><div style="font-family:helvetica,arial;font-size:13px">--&nbsp;<br>Adrian Zubarev<br>Sent with Airmail</div></div> <br><p class="airmail_on">Am 1. Juli 2017 um 19:46:55, jaden.geller@gmail.com (<a href="mailto:jaden.geller@gmail.com">jaden.geller@gmail.com</a>) schrieb:</p> <blockquote type="cite" class="clean_bq"><span><div dir="auto"><div></div><div>



<title></title>


<div><br></div>
<div><br>
On Jun 30, 2017, at 1:48 AM, Adrian Zubarev via swift-evolution
&lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt;
wrote:<br>
<br></div>
<blockquote type="cite">
<div>

<div class="bloop_markdown">
<p>Well as Jordan Rose said on the linked SR, option (1) will
probably never happen. Option (3) only makes sense if all of the
options are supported (in that case there wouldn’t be any need for
explicit <code>@autoclosure</code>, which could simply be merged
into the closure type), or (2) is NOT supported so that one could
pass a default autoclosure.</p>
<p>It leaves us only with (2), which is potentially a (small)
breaking change, but it also feels more like a fix. I cannot
imagine anyone is wrapping whole closures with auto closure, nor do
I think a ‘convenience’ operation should disable the explicit
ability to pass in a closure with the same signature. The latter
feels like a bug. Furthermore I think most code that relies on this
is already doing something like.</p>
<pre><code class="swift">func bar(_ closure: @autoclosure () -&gt; Int) { foo(closure)}

func foo(_ closure: () -&gt; Int)
</code></pre>
<p>But this is only an assumption of mine.</p>
<p>Theoretically it suppose to work the other way around, right?
Again <code>@autoclosure</code> supposed to be a syntactical
convenience feature which implies that it won’t disable *too* much
from the closure type. Disallowing arguments is logical consequence
but not the other issues I mentioned here and in the SR.</p>
<p>—</p>
<p>One question: Do we need to go through a full evolution process
for pitch (2) or is a bug report enough here?</p>
</div>
</div>
</blockquote>
<div>Surely the former—I'm fully against this change, and imagine
others are also. Autoclosure exists to provide opt-in lazy
evaluation of values by wrapping them in a closure. I think it's
semantically incorrect to accept an already wrapped value here, and
adding this sort of implicit conversion can introduce potential
ambiguity when used with generic functions.</div>
<div><br></div>
<div>Very large -1.</div>
<blockquote type="cite">
<div>
<div class="bloop_markdown"></div>
<div class="bloop_original_html">

<div id="bloop_customfont" style="font-family:Helvetica,Arial;font-size:13px; color: rgba(0,0,0,1.0); margin: 0px; line-height: auto;">
<br></div>
<br>
<div id="bloop_sign_1498806914384722944" class="bloop_sign">
<div style="font-family:helvetica,arial;font-size:13px">
--&nbsp;<br>
Adrian Zubarev<br>
Sent with Airmail</div>
</div>
<br>
<p class="airmail_on">Am 30. Juni 2017 um 00:59:45, Beta (<a href="mailto:rwidmann@apple.com">rwidmann@apple.com</a>) schrieb:</p>
<blockquote type="cite" class="clean_bq">
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">
<div>
<div class=""><span>These are all interesting ideas at first blush,
but introduce some oddities into the type system</span></div>
<div class=""><span><br class=""></span></div>
<span>1. We accept this 😳. &nbsp;If we were to take this as an
official language change it would mean that we would allow coercing
T to (_) -&gt; T by emitting a closure that takes an argument list
(of arity given by the contextual type) that we throw away anyways.
&nbsp;I would <i class="">much</i> prefer we diagnose this instead.
&nbsp;@autoclosure is a syntactically convenient way to ask for
laziness - that’s it.</span>
<div class=""><span><br class=""></span>
<div class=""><span>2. Doing this collapses overloads on
@autoclosure</span></div>
<div class=""><span><br class=""></span></div>
<div class="">
<div style="margin: 0px; font-stretch: normal; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""><span><span style="color: #ba2da2" class="">func</span>
foo(<span style="color: #ba2da2" class="">_</span> f : <span style="color: #ba2da2" class="">@autoclosure</span> () -&gt; <span style="color: #703daa" class="">String</span>) {}</span></div>
<div style="margin: 0px; font-stretch: normal; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""><span style="color: #ba2da2" class="">func</span>
foo(<span style="color: #ba2da2" class="">_</span> f : () -&gt;
<span style="color: #703daa" class="">String</span>) {}</div>
<div class=""><br class=""></div>
<div class=""><br class=""></div>
<div class="">Which is fine by me except for the code you would
break that relies on this. &nbsp;I don’t see a reasonable migration
path here - perhaps you have one in mind.</div>
<div class=""><br class=""></div>
<div class="">3. @autoclosure is a parameter attribute.
&nbsp;Allowing it to appear in other positions is redundant and
doesn’t actually accomplish anything outside of maintaining
consistency with the first point.</div>
<div class=""><br class=""></div>
<div class="">I hope I don’t come off as too harsh. &nbsp;It’s just
a little shocking to me that we accept the code in the linked
SR.</div>
<div class=""><br class=""></div>
<div class="">~Robert Widmann</div>
<div><br class="">
<blockquote type="cite" class="">
<div class="">On Jun 24, 2017, at 9:10 AM, Adrian Zubarev via
swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div>
<br class="Apple-interchange-newline">
<div class="">
<div class="bloop_markdown" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 254);">
<p style="margin: 15px 0px; -webkit-margin-before: 0px;" class="">
Hello folks,</p>
<p style="margin: 15px 0px;" class="">Here is a quick and
straightforward pitch about<span class="Apple-converted-space">&nbsp;</span><code style="font-family: Menlo, Consolas, &quot;Liberation Mono&quot;, Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal; -webkit-margin-before: 0px;" class="">@autoclosure</code>. Currently the attribute indicates
that the caller has to pass an expression so that the braces can be
omitted. This is a convenient behavior only, but it also has it’s
shortcomings.</p>
<p style="margin: 15px 0px;" class="">I would like to propose an
extension of that behavior.</p>
<div class="bloop_markdown"><br style="-webkit-margin-before: 0px;" class=""></div>
1. Allow access to arguments and shorthand argument
names:<br class="">
<ol style="margin: 15px 0px;" class=""></ol>
<pre style="margin: 15px 0px; font-family: Menlo, Consolas, &quot;Liberation Mono&quot;, Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(204, 204, 204); overflow: auto; padding: 4px 8px; word-break: normal; word-wrap: normal;" class=""><code class="swift" style="font-family: Menlo, Consolas, &quot;Liberation Mono&quot;, Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 0px; margin: 0px; padding: 0px; word-break: normal; word-wrap: normal; -webkit-margin-before: 0px;">// Bug: <a href="https://bugs.swift.org/browse/SR-5296" style="color: rgb(65, 131, 196); background-color: inherit; text-decoration: none; -webkit-margin-before: 0px;" class="">https://bugs.swift.org/browse/SR-5296</a>
func foo(_ test: @autoclosure (Int) -&gt; Int = { $0 }) {
    print(test(42))
}

// Convenient access using shorthand arguments
foo(Int(Double($0) * 3.14)))
</code></pre>
<div class="bloop_markdown"><br style="-webkit-margin-before: 0px;" class=""></div>
2. Make<span class="Apple-converted-space">&nbsp;</span><code style="font-family: Menlo, Consolas, &quot;Liberation Mono&quot;, Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal;" class="">@autoclosure</code><span class="Apple-converted-space">&nbsp;</span>only wrap when
necessary:<br class="">
<ol style="margin: 15px 0px;" class=""></ol>
<pre style="margin: 15px 0px; font-family: Menlo, Consolas, &quot;Liberation Mono&quot;, Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(204, 204, 204); overflow: auto; padding: 4px 8px; word-break: normal; word-wrap: normal;" class=""><code class="swift" style="font-family: Menlo, Consolas, &quot;Liberation Mono&quot;, Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 0px; margin: 0px; padding: 0px; word-break: normal; word-wrap: normal; -webkit-margin-before: 0px;">func bar(_ test: @autoclosure () -&gt; Int) {
    print(test())
}

let test = { 42 }

// function produces expected type 'Int'; did you mean to call it with '()'?
bar(test)
</code></pre>
<div class="bloop_markdown"><br style="-webkit-margin-before: 0px;" class=""></div>
3. Extend<span class="Apple-converted-space">&nbsp;</span><code style="font-family: Menlo, Consolas, &quot;Liberation Mono&quot;, Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(234, 234, 234); margin: 0px 2px; padding: 0px 5px; word-break: normal; word-wrap: normal;" class="">@autoclosure</code><span class="Apple-converted-space">&nbsp;</span>to closure types in general
(this change is for consistent alignment):</div>
<div class="bloop_markdown" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 254);">
<ol style="margin: 15px 0px; -webkit-margin-before: 0px;" class="">
</ol>
<pre style="margin: 15px 0px; font-family: Menlo, Consolas, &quot;Liberation Mono&quot;, Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 1px solid rgb(204, 204, 204); overflow: auto; padding: 4px 8px; word-break: normal; word-wrap: normal;" class=""><code class="swift" style="font-family: Menlo, Consolas, &quot;Liberation Mono&quot;, Courier, monospace; font-size: 10pt; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; background-color: rgb(248, 248, 248); color: inherit; border: 0px; margin: 0px; padding: 0px; word-break: normal; word-wrap: normal; -webkit-margin-before: 0px;">// Note how we're using the shorthand argument list for this expression
let uppercaseWrapper: @autoclosure (String) -&gt; String = $0.uppercased()
</code></pre>
<div style="margin: 15px 0px;" class=""><br class="webkit-block-placeholder"></div>
</div>
<div class="bloop_original_html" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 254);">
<div id="bloop_customfont" style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class=""><br class=""></div>
<br class="">
<div id="bloop_sign_1498319089122447872" class="bloop_sign">
<div style="font-family: helvetica, arial; font-size: 13px;" class="">--&nbsp;<br class="">
Adrian Zubarev<br class="">
Sent with Airmail</div>
</div>
</div>
<div class="bloop_markdown" style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 254);">
<div style="margin: 15px 0px; -webkit-margin-before: 0px;" class=""><br class="webkit-block-placeholder"></div>
</div>
<span style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 254); float: none; display: inline !important;" class="">_______________________________________________</span><br style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 254);" class="">
<span style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 254); float: none; display: inline !important;" class="">swift-evolution mailing list</span><br style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 254);" class="">
<a href="mailto:swift-evolution@swift.org" style="color: rgb(65, 131, 196); background-color: rgb(254, 254, 254); text-decoration: none; font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">swift-evolution@swift.org</a><br style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 254);" class="">
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" style="color: rgb(65, 131, 196); background-color: rgb(254, 254, 254); text-decoration: none; font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br style="font-family: Helvetica, Arial; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(254, 254, 254);" class=""></div>
</blockquote>
</div>
<br class=""></div>
</div>
</div>
</div>
</blockquote>
</div>
<div class="bloop_markdown"></div>
</div>
</blockquote>
<blockquote type="cite">
<div>
<span>_______________________________________________</span><br>
<span>swift-evolution mailing list</span><br>
<span><a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a></span><br>

<span><a href="https://lists.swift.org/mailman/listinfo/swift-evolution">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br>
</div>
</blockquote>


</div></div></span></blockquote></div><div class="bloop_markdown"><p></p></div></body></html>