<div dir="ltr">On Wed, Aug 3, 2016 at 11:27 PM, Dave Abrahams <span dir="ltr">&lt;<a href="mailto:dabrahams@apple.com" target="_blank">dabrahams@apple.com</a>&gt;</span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class=""><br>
on Wed Aug 03 2016, Xiaodi Wu &lt;<a href="http://xiaodi.wu-AT-gmail.com" rel="noreferrer" target="_blank">xiaodi.wu-AT-gmail.com</a>&gt; wrote:<br>
<br>
&gt; Why not just MemoryLayout.init(of instance: T), and drop the autoclosure<br>
&gt; magic altogether?<br>
<br>
</span>My proposal *does* drop the autoclosure magic.  `type(of: x)` is already in<br>
the standard library (replacing `x.dynamicType`). The reasons not to have:<br>
<br>
   MemoryLayout(of: x)<br>
<br>
where x is an arbitrary instance, is that it reads and pronounces the<br>
same as<br>
<br>
   MemoryLayout&lt;X&gt;<br>
<br>
but has different meaning, and even a different type (which results in<br>
additional API complexity—the forwarding vars I showed in the [Aside]<br>
box from my previous post).  Imagine explaining the difference between<br>
these two in that world:<br>
<br>
   MemoryLayout&lt;Int&gt;<br>
   MemoryLayout(of: Int.self)<br>
<br>
The first is a type representing the layout of Int.  The second is an<br>
instance of that type representing the layout of Int&#39;s metatype.<br>
<span class=""><br>
&gt; The classic sizeofValue evaluated its argument, and in Foundation several<br>
&gt; uses of it actually relied on that side effect. While autoclosures are<br>
&gt; quite clever, in general I think the user expectation is that given<br>
&gt; `a(b(c))` both a and b are invoked, side effects and all.<br>
&gt;<br>
&gt; Note that both type(of:) as it&#39;s currently implemented and the old<br>
&gt; dynamicType evaluate its argument/receiver.<br>
<br>
</span>I didn&#39;t realize that, but it&#39;s fine.  I&#39;m attached to the use of<br>
`type(of:)` in this idiom, not to having an autoclosure involved.<br></blockquote><div><br></div><div>Your proposed `.of(type(of: x)).size` differs from the original `sizeofValue()` in at least one other way--is this in fact *why* you&#39;re proposing the change? In the classic syntax:</div><div><br></div><div>```</div><div><div>protocol P { }</div><div>print(sizeof(P.self)) // 40</div><div><br></div><div>struct S : P {</div><div>  let x = 2</div><div>}</div><div>print(sizeof(S.self)) // 8</div><div><br></div><div>var a: P = S()</div><div>print(a.dynamicType) // S</div><div>print(sizeofValue(a)) // 40</div></div><div>```</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class=""><div class="h5">
&gt; No one afaik has ever thought that behavior to be anomalous (though I<br>
&gt; bet we&#39;re about to hear some arguments to that effect now).<br>
&gt;<br>
&gt; On Wed, Aug 3, 2016 at 15:46 Dave Abrahams via swift-evolution &lt;<br>
&gt; <a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt;&gt;<br>
&gt;&gt; Having seen the effects in the standard library and in other<br>
&gt;&gt; code, I&#39;m concerned that we may have made a mistake in removing<br>
&gt;&gt; `sizeofValue` et al without providing a replacement.  In the standard<br>
&gt;&gt; library, we ended up adding an underscored API that allows<br>
&gt;&gt;<br>
&gt;&gt;   MemoryLayout._ofInstance(someExpression).size<br>
&gt;&gt;<br>
&gt;&gt; Where someExpression is an autoclosure, and thus not evaluated.  I<br>
&gt;&gt; wanted to bring up the possibility of introducing a replacement as a<br>
&gt;&gt; bufix.<br>
&gt;&gt;<br>
&gt;&gt; I propose that the way to express the above should be:<br>
&gt;&gt;<br>
&gt;&gt;   MemoryLayout.of(type(of: someExpression)).size<br>
&gt;&gt;<br>
&gt;&gt; implementable as:<br>
&gt;&gt;<br>
&gt;&gt;   extension MemoryLayout {<br>
&gt;&gt;     @_transparent<br>
&gt;&gt;     public<br>
&gt;&gt;     static func of(_: T.Type) -&gt; MemoryLayout&lt;T&gt;.Type {<br>
&gt;&gt;       return MemoryLayout&lt;T&gt;.self<br>
&gt;&gt;     }<br>
&gt;&gt;   }<br>
&gt;&gt;<br>
&gt;&gt; I think this API would solve the concerns I had about confusability that<br>
&gt;&gt; led me to advocate dropping the ability to ask for the size of a value.<br>
&gt;&gt; The only way to use it is to pass a type and these two expressions have<br>
&gt;&gt; equivalent meaning:<br>
&gt;&gt;<br>
&gt;&gt;     MemoryLayout&lt;Int&gt;<br>
&gt;&gt;     MemoryLayout.of(Int.self)<br>
&gt;&gt;<br>
&gt;&gt; It also has the benefit of isolating the autoclosure magic to type(of:).<br>
&gt;&gt;<br>
&gt;&gt; ,----[ Aside ]<br>
&gt;&gt; | A slightly cleaner use site is possible with a larger API change:<br>
&gt;&gt; |<br>
&gt;&gt; |   MemoryLayout(type(of: someExpression)).size<br>
&gt;&gt; |<br>
&gt;&gt; | Which would involve changing MemoryLayout from an `enum` to<br>
&gt;&gt; | a `struct` and adding the following:<br>
&gt;&gt; |<br>
&gt;&gt; |   extension MemoryLayout {<br>
&gt;&gt; |     public init(_: T.Type) {}<br>
&gt;&gt; |<br>
&gt;&gt; |     public var size: Int { return MemoryLayout.size }<br>
&gt;&gt; |     public var stride: Int { return MemoryLayout.stride }<br>
&gt;&gt; |     public var alignment: Int { return MemoryLayout.alignment }<br>
&gt;&gt; |   }<br>
&gt;&gt; |<br>
&gt;&gt; | However I am concerned that dropping &quot;.of&quot; at the use site is worth the<br>
&gt;&gt; | added API complexity.<br>
&gt;&gt; `----<br>
&gt;&gt;<br>
&gt;&gt; Thoughts?<br>
&gt;&gt; --<br>
&gt;&gt; -Dave<br>
&gt;&gt;<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt; swift-evolution mailing list<br>
&gt;&gt; <a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
&gt;&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
&gt;&gt;<br>
<br>
</div></div><span class=""><font color="#888888">--<br>
-Dave<br>
</font></span></blockquote></div><br></div></div>