<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div>On May 26, 2008, at 11:57 AM, Graydon Hoare wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><blockquote type="cite"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font class="Apple-style-span" color="#0000DD"><br></font>* I thought "like" was dead. How did it get revived?</div> </blockquote><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">As a (value * type) binary operator, rather than as a type. It also<span class="Apple-converted-space"> </span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">(presently) has a form in which it can annotate a function parameter,<span class="Apple-converted-space"> </span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">which implicitly causes the an assertion of the operator against the<span class="Apple-converted-space"> </span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">provided type when the function is entered. This annotation behavior on<span class="Apple-converted-space"> </span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">function parameter lists is something I'm not terribly pleased with, but<span class="Apple-converted-space"> </span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">then, the most natural boundary between annotated and unannotated code<span class="Apple-converted-space"> </span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">appears to be that of a function call, so it's possibly sensible to<span class="Apple-converted-space"> </span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">leave extra conveniences there.</div></blockquote><div><br></div>It's particularly helpful on return types to avoid forcing control to flow through a single exit block, in which to write a like expression in an if whose consequent throws a new TypeError (I got tired just writing that ;-).</div><div><br></div><div>But it helps also on arguments:</div><div><br></div><div>function f(a like T, b like U, c like V) {</div><div>  ...</div><div>}</div><div><br></div><div>instead of</div><div><br></div><div>function f(a, b, c) {</div><div>  if (!(a like T)) throw new TypeError;</div><div>  if (!(b like U)) throw new TypeError;</div><div>  if (!(c like V)) throw new TypeError;</div><div>  ...</div><div>}</div><div><br></div><div>/be</div></body></html>