<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Feb 20, 2018 at 12:33 PM, Александр Ефремов <span dir="ltr"><<a href="mailto:mr.efrem@gmail.com" target="_blank">mr.efrem@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Anyone else has interes to this proposal?<br></blockquote><div><br></div><div>I'm probably just going to echo themes that T.J. has dealt with better, but:<br></div><div><br></div><div>Things i like:</div><div>- provides preconditions</div><div>- guards locals</div><div><br></div><div>Things I don't like:</div><div>- doesn't deal with postconditions</div><div>- somewhat redundant with annotations</div><div>- adds syntax</div><div><br></div><div>It seems that there are two separable issues:</div><div>1. Defining guards</div><div>2. Syntax for specifying guards.</div><div><br></div><div>It seems to me that (2) might be doable with annotations for locals,</div><div>so deploying guards could build on annotations.</div><div><br></div><div>Where your proposal shines, is in a definition of a guard.</div><div>I don't much like the way the definition is tied to classes though.</div><div>Maybe, for</div><div>  class C {}<br></div><div>make</div><div>  C(x)  // [[Call]] not [[Construct]]</div><div>default to (x instanceof this) unless the static property you propose is defined.</div><div><br></div><div>That would allow you to use any function type as a value predicate which is the<br></div><div>minimum needed for a guard.</div><div><br></div><div>Leave sub-types that don't override [hasInstance] from super-types to linters.</div><div><br></div><div>If confusion between (new C(x)) and (C(x)) is too much of a hazard, maybe</div><div>adjust the calling convention for guards so that they always receive a well-known</div><div>symbol as the first argument, so can switch between acting as a predicate and</div><div>telling developers how to create class instances.</div></div></div></div>