<p dir="ltr">I implemented what I thought would do this a long time ago, so if it isn&#39;t there then I must be misremembering or things have changed in the code to make it not happen.</p>
<p dir="ltr">Sam</p>
<div class="gmail_quote">On Sep 9, 2013 9:13 PM, &quot;Eric Dobson&quot; &lt;<a href="mailto:eric.n.dobson@gmail.com">eric.n.dobson@gmail.com</a>&gt; wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
When did you add this? Last time I checked (June-ish) this was not<br>
added. Can you point to the code that does it?<br>
<br>
On Mon, Sep 9, 2013 at 5:55 PM, Sam Tobin-Hochstadt<br>
&lt;<a href="mailto:samth@cs.indiana.edu">samth@cs.indiana.edu</a>&gt; wrote:<br>
&gt; Not only did our own Sam write about this, but he thought that he changed<br>
&gt; Typed Racket to do this. Am I missing something here, or are you describing<br>
&gt; more optimization than we do already or ...?<br>
&gt;<br>
&gt; Sam<br>
&gt;<br>
&gt; On Sep 9, 2013 8:33 PM, &quot;Robby Findler&quot; &lt;<a href="mailto:robby@eecs.northwestern.edu">robby@eecs.northwestern.edu</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; FWIW, this is something that&#39;s been studied in small calculi in the<br>
&gt;&gt; literature. Nothing that will have to get thru all of the little details<br>
&gt;&gt; that you have to get right to make it work in a real language design like<br>
&gt;&gt; TR, but maybe you&#39;ll find some useful ways to look at the problem. (Mostly<br>
&gt;&gt; the papers I&#39;m thinking of have Jeremy Siek as a co-author but there are<br>
&gt;&gt; others, including our own Sam.)<br>
&gt;&gt;<br>
&gt;&gt; Robby<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; On Mon, Sep 9, 2013 at 7:14 PM, Eric Dobson &lt;<a href="mailto:eric.n.dobson@gmail.com">eric.n.dobson@gmail.com</a>&gt;<br>
&gt;&gt; wrote:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; I have ideas to remove about the contracts from TR code, but currently<br>
&gt;&gt;&gt; that is only prototyped.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Example:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; #lang typed/racket<br>
&gt;&gt;&gt; (provide f)<br>
&gt;&gt;&gt; (: f (Number -&gt; Number))<br>
&gt;&gt;&gt; (define (f x) x)<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Currently f is exported with the contract (number? . -&gt; . number?),<br>
&gt;&gt;&gt; but this can be safely reduced to (number . -&gt; . any). This is because<br>
&gt;&gt;&gt; the return value contract is checking things we have already ensured<br>
&gt;&gt;&gt; statically. IIRC checking return values of functions is much more<br>
&gt;&gt;&gt; expensive than just arguments, so this should reduce the cost of TR<br>
&gt;&gt;&gt; boundary cost, but I don&#39;t have any numbers.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; On Mon, Sep 9, 2013 at 10:57 AM, Sam Tobin-Hochstadt<br>
&gt;&gt;&gt; &lt;<a href="mailto:samth@cs.indiana.edu">samth@cs.indiana.edu</a>&gt; wrote:<br>
&gt;&gt;&gt; &gt; On Mon, Sep 9, 2013 at 11:35 AM, Neil Toronto &lt;<a href="mailto:neil.toronto@gmail.com">neil.toronto@gmail.com</a>&gt;<br>
&gt;&gt;&gt; &gt; wrote:<br>
&gt;&gt;&gt; &gt;&gt; Nice, and thanks for the explanation. Just to make sure I get it: does<br>
&gt;&gt;&gt; &gt;&gt; this<br>
&gt;&gt;&gt; &gt;&gt; mean fully expanded TR modules are smaller?<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt; Yes.<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt;&gt; Does it reduce the number of generated contracts?<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt; No.<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt; On 09/08/2013 12:24 PM, Sam Tobin-Hochstadt wrote:<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; Typed Racket has to expand into code that registers the type of each<br>
&gt;&gt;&gt; &gt;&gt;&gt; module-top-level identifier in the global environment so that other<br>
&gt;&gt;&gt; &gt;&gt;&gt; modules can find the types to typecheck with.  For example, this<br>
&gt;&gt;&gt; &gt;&gt;&gt; program:<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; #lang typed/racket<br>
&gt;&gt;&gt; &gt;&gt;&gt; (provide x)<br>
&gt;&gt;&gt; &gt;&gt;&gt; (define: x : Integer 1)<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; expands into (greatly simplified):<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; #lang ...<br>
&gt;&gt;&gt; &gt;&gt;&gt; (#%provide x)<br>
&gt;&gt;&gt; &gt;&gt;&gt; (begin-for-syntax<br>
&gt;&gt;&gt; &gt;&gt;&gt;    (declare #&#39;x Integer-rep))<br>
&gt;&gt;&gt; &gt;&gt;&gt; (define-values (x) 1)<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; but what is `Integer-rep`?  It needs to be an expression that<br>
&gt;&gt;&gt; &gt;&gt;&gt; _constructs_ the internal Typed Racket representation of the<br>
&gt;&gt;&gt; &gt;&gt;&gt; `Integer`<br>
&gt;&gt;&gt; &gt;&gt;&gt; type. Previously, that looked something like this:<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;      (make-Union (sort (list Negative-Fixnum-rep Positive-Fixnum-rep<br>
&gt;&gt;&gt; &gt;&gt;&gt; ...)))<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; and so on and so forth for the components, all the way down to base<br>
&gt;&gt;&gt; &gt;&gt;&gt; types.  You can imagine how this gets quite large, especially for<br>
&gt;&gt;&gt; &gt;&gt;&gt; large types.<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; However, this is wasteful, because every Typed Racket program, at<br>
&gt;&gt;&gt; &gt;&gt;&gt; type<br>
&gt;&gt;&gt; &gt;&gt;&gt; checking time, defines a constant that&#39;s the representation of the<br>
&gt;&gt;&gt; &gt;&gt;&gt; `Integer` type, right here [1]. So instead of serializing an<br>
&gt;&gt;&gt; &gt;&gt;&gt; expression that constructs the same thing as `-Int`, we can just<br>
&gt;&gt;&gt; &gt;&gt;&gt; *reference* `-Int` in the expanded code.  To make that possible,<br>
&gt;&gt;&gt; &gt;&gt;&gt; Typed<br>
&gt;&gt;&gt; &gt;&gt;&gt; Racket now builds a hash table [2] mapping types (really, their<br>
&gt;&gt;&gt; &gt;&gt;&gt; representations) to identifiers that denote those types. Then the<br>
&gt;&gt;&gt; &gt;&gt;&gt; serializer just consults this table [3].<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; It turns out that base types (but no others) already used basically<br>
&gt;&gt;&gt; &gt;&gt;&gt; this mechanism, by storing the identifier *in* the type<br>
&gt;&gt;&gt; &gt;&gt;&gt; representation.  But that&#39;s now obsolete, and thus was removed in my<br>
&gt;&gt;&gt; &gt;&gt;&gt; subsequent commit.<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; As a result, the type serialization is much smaller.<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; [1]<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; <a href="https://github.com/plt/racket/blob/master/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/numeric-tower.rkt#L107" target="_blank">https://github.com/plt/racket/blob/master/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/numeric-tower.rkt#L107</a><br>

&gt;&gt;&gt; &gt;&gt;&gt; [2]<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; <a href="https://github.com/plt/racket/blob/master/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/base-abbrev.rkt#L23" target="_blank">https://github.com/plt/racket/blob/master/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/base-abbrev.rkt#L23</a><br>

&gt;&gt;&gt; &gt;&gt;&gt; [3]<br>
&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; <a href="https://github.com/plt/racket/blob/master/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/env/init-envs.rkt#L51" target="_blank">https://github.com/plt/racket/blob/master/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/env/init-envs.rkt#L51</a><br>

&gt;&gt;&gt; &gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; On Sat, Sep 7, 2013 at 3:20 PM, Neil Toronto &lt;<a href="mailto:neil.toronto@gmail.com">neil.toronto@gmail.com</a>&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt; wrote:<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt; On 09/06/2013 04:14 PM, <a href="mailto:samth@racket-lang.org">samth@racket-lang.org</a> wrote:<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; 56b372c Sam Tobin-Hochstadt &lt;<a href="mailto:samth@racket-lang.org">samth@racket-lang.org</a>&gt; 2013-09-06<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; 14:22<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; :<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; | Remember types that are defined, and use them in serialization.<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; |<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; | This extends a facility already available for base types,<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; | making that facility no longer strictly needed.<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; |<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; | Shrinks the zo size for the `math` package by almost 1MB.<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; :<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;     M .../typed-racket/env/init-envs.rkt                |   1 +<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;     M .../typed-racket/typecheck/def-export.rkt         |   7 +-<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;     M .../typed-racket/typecheck/tc-toplevel.rkt        |  31<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; +++---<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;     M .../typed-racket/types/abbrev.rkt                 |  36<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; +++----<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;     M .../typed-racket/types/base-abbrev.rkt            |  12 ++-<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt;     M .../typed-racket/types/numeric-tower.rkt          | 108<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;&gt; +++++++++----------<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt; Would you mind explaining this a little more? It sounds interesting,<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt; and<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt; the<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt; commit almost has my name in it. :)<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt; Neil ⊥<br>
&gt;&gt;&gt; &gt;&gt;&gt;&gt;<br>
&gt;&gt;&gt; &gt;&gt;<br>
&gt;&gt;&gt; &gt;<br>
&gt;&gt;&gt; &gt; _________________________<br>
&gt;&gt;&gt; &gt;   Racket Developers list:<br>
&gt;&gt;&gt; &gt;   <a href="http://lists.racket-lang.org/dev" target="_blank">http://lists.racket-lang.org/dev</a><br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; _________________________<br>
&gt;&gt;&gt;   Racket Developers list:<br>
&gt;&gt;&gt;   <a href="http://lists.racket-lang.org/dev" target="_blank">http://lists.racket-lang.org/dev</a><br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;<br>
</blockquote></div>