<div dir="ltr">It would be useful in the case of designing macros. The macro could make decisions based not only on syntax but on type. <div><br>Although to be honest (and to answer Robby's earlier question) I came across this while avoiding a longer but better way to design my program.<br>
<br>--Spencer</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Jun 16, 2014 at 2:46 PM, Alexander D. Knauth <span dir="ltr"><<a href="mailto:alexander@knauth.org" target="_blank">alexander@knauth.org</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5"><br>
On Jun 16, 2014, at 3:41 PM, Sam Tobin-Hochstadt <<a href="mailto:samth@cs.indiana.edu">samth@cs.indiana.edu</a>> wrote:<br>
<br>
> On Mon, Jun 16, 2014 at 3:29 PM, Alexander D. Knauth<br>
> <<a href="mailto:alexander@knauth.org">alexander@knauth.org</a>> wrote:<br>
>><br>
>> On Jun 16, 2014, at 3:13 PM, Sam Tobin-Hochstadt <<a href="mailto:samth@cs.indiana.edu">samth@cs.indiana.edu</a>> wrote:<br>
>><br>
>>> On Mon, Jun 16, 2014 at 3:06 PM, Alexander D. Knauth<br>
>>> <<a href="mailto:alexander@knauth.org">alexander@knauth.org</a>> wrote:<br>
>>>><br>
>>>>> Typed Racket functions are<br>
>>>>> just plain Racket functions. We could add some extra metadata to every<br>
>>>>> value that held its type,<br>
>>>><br>
>>>> It wouldn’t have to be every value, it could just put that information in for :has-type expressions, right?<br>
>>>> Would that still require fundamental changes to Racket?<br>
>>><br>
>>> The problem is that the information needs to get attached to the value<br>
>>> where the value is created, not where you use `:has-type?`.  The<br>
>>> `:has-type?` could even be in some other module, so you'd have to add<br>
>>> this information to every value, everywhere.  That's why it would need<br>
>>> to be part of the runtime.<br>
>><br>
>> Then how would ann do it?<br>
>><br>
>> I was thinking of something that would work sort of like ann, except that if it has the type, it would put true there (instead of the value), and<br>
>> if it doesn’t, then it would put false there (instead of raising an error).<br>
>><br>
>> I understand that there’s no way to do this at ‘expansion’ time because it type checks it after it expands, but is there any way<br>
>> to do this at ‘type-check’ time?  That’s what ann does, right?<br>
>><br>
>> That way the actual checking wouldn’t have to happen at runtime.<br>
>><br>
>> Or do I have this expansion-time, type-check-time, run-time thing wrong somewhere?<br>
><br>
> I think you have the various times right, but this proposal won't work<br>
> either. In particular, now your original example won't work:<br>
><br>
> (cond [(:has-type? f (Number -> Any))<br>
>       (f 1)]<br>
>      [(:has-type? f (String -> Any))<br>
>       (f "1")])<br>
><br>
> Imagine the `f` has type `Any at the start.  Then if you replace<br>
> `:has-type?` with `ann`, you get a type error.<br>
><br>
> Unless you're suggesting that `f` would have to already have one of<br>
> those types, in which case I'm not sure how it helps you.<br>
><br>
> Sam<br>
<br>
</div></div>Oh, I hadn’t realized that.  f would have to already have one of those types, so it wouldn’t really help.<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
<br>
____________________<br>
  Racket Users list:<br>
  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
</div></div></blockquote></div><br></div>