<div dir="ltr">That is also what I meant by code (well, I was speaking generally about all bytecode). <div><br></div><div>The point I&#39;m making is that this is not a limitation of our runtime system, it is just because you are imagining there are still references to that bytecode.</div>
<div><br></div><div>In the specific instance you mention below, the namespace holding onto that module could become garbage. This happens in DrRacket a lot, for example.</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">
On Thu, Feb 14, 2013 at 7:45 AM, Jay McCarthy <span dir="ltr">&lt;<a href="mailto:jay.mccarthy@gmail.com" target="_blank">jay.mccarthy@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
When I say &quot;code&quot;, I mean module top-level binding byte-code. There&#39;s<br>
no way for Racket to remove<br>
<br>
(define (f x) (lambda (y) (printf &quot;Gigantic string: ~a&quot; (+ x y))))<br>
<br>
at the top-level. The byte-code will always contain the gigantic<br>
string. If you ever call f and get back something, that closure could<br>
be collected, but not the source that generated it.<br>
<span class="HOEnZb"><font color="#888888"><br>
Jay<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
On Thu, Feb 14, 2013 at 6:37 AM, Robby Findler<br>
&lt;<a href="mailto:robby@eecs.northwestern.edu">robby@eecs.northwestern.edu</a>&gt; wrote:<br>
&gt; I&#39;m pretty sure code is collected in (regular) Racket. Small numbers aren&#39;t<br>
&gt; collected, true, but they also don&#39;t really take any space. Big numbers are<br>
&gt; collected, too. (I&#39;m not sure about interned symbols.)<br>
&gt;<br>
&gt; Robby<br>
&gt;<br>
&gt;<br>
&gt; On Thu, Feb 14, 2013 at 7:26 AM, Jay McCarthy &lt;<a href="mailto:jay.mccarthy@gmail.com">jay.mccarthy@gmail.com</a>&gt;<br>
&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; In the Web server language, all anonymous functions are turned into<br>
&gt;&gt; top-level structures masquerading as functions where the fields are<br>
&gt;&gt; their free variables. For instance:<br>
&gt;&gt;<br>
&gt;&gt; (define (f x) (lambda (y) (+ x y))<br>
&gt;&gt;<br>
&gt;&gt; becomes, roughly,<br>
&gt;&gt;<br>
&gt;&gt; (struct a-lambda42 (x)<br>
&gt;&gt;  #:property prop:procedure<br>
&gt;&gt;  (lambda (the-structure y)<br>
&gt;&gt;   (define x (a-lambda42-x the-structure))<br>
&gt;&gt;   (+ x y)))<br>
&gt;&gt; (define (f x) (make-a-lambda42 x))<br>
&gt;&gt;<br>
&gt;&gt; In your program, the expression<br>
&gt;&gt;<br>
&gt;&gt; (web-cell-shadow wc-anonymous (λ (x) &#39;more-distinctive-text))<br>
&gt;&gt;<br>
&gt;&gt; becomes<br>
&gt;&gt;<br>
&gt;&gt; (struct a-lambda43 () #:property prop:procedure (lambda (s x)<br>
&gt;&gt; &#39;more-distinctive-text))<br>
&gt;&gt; (web-cell-shadow wc-anonymous (make-a-lambda43))<br>
&gt;&gt;<br>
&gt;&gt; Notice that the anonymous function has no fields because there are no<br>
&gt;&gt; free variables. The distinctive text is not shown anywhere in the URL<br>
&gt;&gt; because it is part of the code, not part of the data, of the closure.<br>
&gt;&gt;<br>
&gt;&gt; If you change the program slightly to<br>
&gt;&gt;<br>
&gt;&gt; (web-cell-shadow wc-anonymous<br>
&gt;&gt;                  (let () (define y &#39;more-distinctive-text)<br>
&gt;&gt;                       (λ (x) y)))<br>
&gt;&gt;<br>
&gt;&gt; then y is a free variable, so when you look at the URL:<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; <a href="http://localhost:8000/;((%22c%22%20.%20%220((3)%204%20(((lib%20%5C%22web-server%2Flang%2Fabort-resume.rkt%5C%22)%20.%20%5C%22lifted.6%5C%22)%20((lib%20%5C%22web-server%2Flang%2Fweb-cells.rkt%5C%22)%20.%20deserialize-info:frame-v0)%20(%23%5C%22%2Ftmp%2Ft.rkt%5C%22%20.%20%5C%22lifted.1683%5C%22)%20(2%20.%20%5C%22lifted.1991%5C%22))%200%20()%20()%20(0%20(1%20(h%20-%20()%20(lifted.1485-0%20.%20this-is-a-song-about-Japan)%20(lifted.1521-1%202%20(b!%20.%20more-distinctive-text))))%20(c%20(v!%20(3)%20%23f%20%23f))))%22))" target="_blank">http://localhost:8000/;((%22c%22%20.%20%220((3)%204%20(((lib%20%5C%22web-server%2Flang%2Fabort-resume.rkt%5C%22)%20.%20%5C%22lifted.6%5C%22)%20((lib%20%5C%22web-server%2Flang%2Fweb-cells.rkt%5C%22)%20.%20deserialize-info:frame-v0)%20(%23%5C%22%2Ftmp%2Ft.rkt%5C%22%20.%20%5C%22lifted.1683%5C%22)%20(2%20.%20%5C%22lifted.1991%5C%22))%200%20()%20()%20(0%20(1%20(h%20-%20()%20(lifted.1485-0%20.%20this-is-a-song-about-Japan)%20(lifted.1521-1%202%20(b!%20.%20more-distinctive-text))))%20(c%20(v!%20(3)%20%23f%20%23f))))%22))</a><br>

&gt;&gt;<br>
&gt;&gt; You see the distinctive text.<br>
&gt;&gt;<br>
&gt;&gt; As far as GC goes, code is not generally collected in Racket anyways.<br>
&gt;&gt; Any data that is an intrinsic part of the program text (such as<br>
&gt;&gt; literal symbols and numbers) will always be around in your program<br>
&gt;&gt; whether you use #lang web-server or not.<br>
&gt;&gt;<br>
&gt;&gt; Jay<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; On Wed, Feb 13, 2013 at 8:34 PM, Galler &lt;<a href="mailto:lzgaller@optonline.net">lzgaller@optonline.net</a>&gt; wrote:<br>
&gt;&gt; &gt; Good evening,<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; I&#39;ve been investigating lang web-server, performance and garbage<br>
&gt;&gt; &gt; collection<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; I have a question regarding anonymous functions and web cells<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Examples below require:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; #lang web-server<br>
&gt;&gt; &gt; (require racket/serialize<br>
&gt;&gt; &gt;          web-server/lang/web-cells)<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Constants appear serializable by their value being explicitly written<br>
&gt;&gt; &gt; out<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; For example,<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; (serialize &#39;this-is-a-song-about-japan)<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; ;-&gt; &#39;((3) 0 () 0 () () this-is-a-song-about-japan)<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Whereas anonymous functions appear serializable by the mechanism of<br>
&gt;&gt; &gt; being<br>
&gt;&gt; &gt; &quot;lifted&quot; (i.e. reified) to a module level binding<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; For example<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; (serialize (λ (x) x))<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; ;-&gt; &#39;((3) 1 ((&#39;anonymous-module . &quot;lifted.1386&quot;)) 0 () () (0))<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Moving the discussion to web-cells<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; (define wc-constant (make-web-cell #f))<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; (define wc-anonymous (make-web-cell #f))<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; (web-cell-shadow wc-constant &#39;this-is-a-song-about-Japan)<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; (web-cell-shadow wc-anonymous (λ (x) x))<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;  (printf &quot; wc-constant: ~A\n wc-anonymous: ~A\n&quot;<br>
&gt;&gt; &gt;           (serialize wc-1)<br>
&gt;&gt; &gt;           (serialize wc-2))<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; returns<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; wc-constant: ((3) 1 (((lib web-server/lang/web-cells.rkt) .<br>
&gt;&gt; &gt; deserialize-info:primitive-wc-v0)) 0 () () (0 lifted.1534-0))<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; wc-anonymous: ((3) 1 (((lib web-server/lang/web-cells.rkt) .<br>
&gt;&gt; &gt; deserialize-info:primitive-wc-v0)) 0 () () (0 lifted.1570-1))<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; While now both values are &#39;lifted&#39; (i.e. reified), a close examination<br>
&gt;&gt; &gt; of<br>
&gt;&gt; &gt; the URL-string sent back to a client after send/suspend/dispatch<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; reveals that, with respect to the constant, lifted.1534 appears to be<br>
&gt;&gt; &gt; explicitly represented, elsewhere in the string as an associative pair<br>
&gt;&gt; &gt; i.e.<br>
&gt;&gt; &gt; (lifted.1534 this-is-a-song-about-Japan)<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; whereas for the anonymous function, its not clear that its reference,<br>
&gt;&gt; &gt; lifted.1570 is explicitly represented<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Which leads me to wonder about whether the reference to the anonymous<br>
&gt;&gt; &gt; function, lifted.1570, is being maintained on the server,<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; And if so, how is it being garbage collected, as its impossible to ever<br>
&gt;&gt; &gt; determine that it is unreachable.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; I will also point out that prior to a year ago, anonymous functions<br>
&gt;&gt; &gt; failed<br>
&gt;&gt; &gt; the serializability predicate. (serializable? anon-func) -&gt; #f. I can<br>
&gt;&gt; &gt; pull<br>
&gt;&gt; &gt; out the correspondence/background related to that if desirable.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; I apologize if I&#39;m just misreading the data.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Here&#39;s the complete example,with a stateless web server. Note that when<br>
&gt;&gt; &gt; you<br>
&gt;&gt; &gt; inspect the url-string**for the datum this-is-a-song-about-Japan, its<br>
&gt;&gt; &gt; there,<br>
&gt;&gt; &gt; but when looking for the datum more-distinctive-text, its not present in<br>
&gt;&gt; &gt; the<br>
&gt;&gt; &gt; url-string.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; **right click on the link, then copy/paste, or click the &#39;click-me&#39; link<br>
&gt;&gt; &gt; and<br>
&gt;&gt; &gt; copy/paste the URL from the address bar)<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Thanks very much.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Thanks again.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; #lang web-server<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; (require  web-server/servlet-env)<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; (define wc-constant (make-web-cell #f))<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; (define wc-anonymous (make-web-cell #f))<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; (web-cell-shadow wc-constant &#39;this-is-a-song-about-Japan)<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; (web-cell-shadow wc-anonymous (λ (x) &#39;more-distinctive-text))<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; (define (start request)<br>
&gt;&gt; &gt;   (letrec ((response-generator (λ (make-url)<br>
&gt;&gt; &gt;                               (response/xexpr `(html (head)<br>
&gt;&gt; &gt;                                                      (body (a ((href<br>
&gt;&gt; &gt; ,(format &quot;~A&quot; (make-url receive-request)))) &quot;click me&quot;))))))<br>
&gt;&gt; &gt;            (receive-request (λ (request)<br>
&gt;&gt; &gt;                               (response/xexpr `(html (head)<br>
&gt;&gt; &gt;                                                      (body &quot;Thank you.<br>
&gt;&gt; &gt; We<br>
&gt;&gt; &gt; are done.&quot;))))))<br>
&gt;&gt; &gt;     (send/suspend/dispatch response-generator)))<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; (serve/servlet start<br>
&gt;&gt; &gt;                #:stateless? #t<br>
&gt;&gt; &gt;                #:launch-browser? #t<br>
&gt;&gt; &gt;                #:connection-close? #t<br>
&gt;&gt; &gt;                #:quit? #f<br>
&gt;&gt; &gt;                #:listen-ip #f<br>
&gt;&gt; &gt;                #:port 8000<br>
&gt;&gt; &gt;                #:servlet-path &quot;/&quot;)<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Thanks much.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Zack<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; --<br>
&gt;&gt; Jay McCarthy &lt;<a href="mailto:jay@cs.byu.edu">jay@cs.byu.edu</a>&gt;<br>
&gt;&gt; Assistant Professor / Brigham Young University<br>
&gt;&gt; <a href="http://faculty.cs.byu.edu/~jay" target="_blank">http://faculty.cs.byu.edu/~jay</a><br>
&gt;&gt;<br>
&gt;&gt; &quot;The glory of God is Intelligence&quot; - D&amp;C 93<br>
&gt;&gt;<br>
&gt;&gt; ____________________<br>
&gt;&gt;   Racket Users list:<br>
&gt;&gt;   <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
&gt;<br>
&gt;<br>
<br>
<br>
<br>
--<br>
Jay McCarthy &lt;<a href="mailto:jay@cs.byu.edu">jay@cs.byu.edu</a>&gt;<br>
Assistant Professor / Brigham Young University<br>
<a href="http://faculty.cs.byu.edu/~jay" target="_blank">http://faculty.cs.byu.edu/~jay</a><br>
<br>
&quot;The glory of God is Intelligence&quot; - D&amp;C 93<br>
</div></div></blockquote></div><br></div>