Re: [racket-users] Re: Naming conventions for private functions
Cool. Thank you, Robby and Matthias. On Fri, Oct 13, 2017 at 9:50 PM, Robby Findler wrote: > If you want to know what the current racket does (not what the > chez-based one does), then you can "raco make x.rkt" and then "raco > decompile x.rkt" to see what is going on. > > In the cod quoted below, no closures are allocated because all of the > functions bar, baz, and jaz are eliminated before runtime. > > The current compiler doesn't try to do anything with set!, so if you > changed the program to this one: > > #lang racket > > (define (foo.1 x) > (define (bar) x) > (set! bar bar) > (bar)) > > (define (foo.2 x) > (define (baz) 8) > (define (jaz) x) > (set! baz baz) > (set! jaz jaz) > (println (jaz)) > (baz)) > > > you will see some lambda expressions survive. > > Of course, this may not be a bad thing, depending on what the actual > application itself is doing. And it may be the case that some of those > with empty closures aren't allocated, depending on various factors. > > Robby > > > On Fri, Oct 13, 2017 at 8:19 PM, David Storrs wrote: >> On Fri, Oct 13, 2017 at 2:57 PM, Matthias Felleisen >> wrote: >>> On Oct 13, 2017, at 2:55 PM, David Storrs wrote: On Fri, Oct 13, 2017 at 2:50 PM, David Storrs wrote: > Coming from a Perl background, I've long had a convention of naming > private functions with a leading underscore, e.g. _do-the-thing. Is > there a standard Racket convention for this and, if so, what is it? Addendum: I know that I can define functions inside the function for which they are the helper, but my understanding is that if I do that then the helper function is recompiled every time the parent function is executed. (define (flurble args) (define (helper-func) ...do stuff...) (helper-func ...)) (for ((i 1)) (flurble i)) ; helper-func will be built 10,000 times, right? >>> >>> >>> No it isn’t recompiled. But the run-time may allocate a closure a second >>> time. >>> Lambda lifting and similar techniques should avoid this but not necessarily >>> in >>> the current compiler. >> >> >> (define (foo x) >> (for ((i 1)) >> (define (bar) x) >> (bar))) >> >> So bar will be allocated 10,000 times in the above? How about baz and >> jaz in the below? >> >> >> (define (foo x) >> (define (baz) 8) >> (define (jaz) x) >> (println (jaz)) >> (baz)) >> >> (for ((i 1)) >> (foo 7)) >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Racket Users" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to racket-users+unsubscr...@googlegroups.com. >> For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to racket-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: [racket-users] Re: Naming conventions for private functions
If you want to know what the current racket does (not what the chez-based one does), then you can "raco make x.rkt" and then "raco decompile x.rkt" to see what is going on. In the cod quoted below, no closures are allocated because all of the functions bar, baz, and jaz are eliminated before runtime. The current compiler doesn't try to do anything with set!, so if you changed the program to this one: #lang racket (define (foo.1 x) (define (bar) x) (set! bar bar) (bar)) (define (foo.2 x) (define (baz) 8) (define (jaz) x) (set! baz baz) (set! jaz jaz) (println (jaz)) (baz)) you will see some lambda expressions survive. Of course, this may not be a bad thing, depending on what the actual application itself is doing. And it may be the case that some of those with empty closures aren't allocated, depending on various factors. Robby On Fri, Oct 13, 2017 at 8:19 PM, David Storrs wrote: > On Fri, Oct 13, 2017 at 2:57 PM, Matthias Felleisen > wrote: >> >>> On Oct 13, 2017, at 2:55 PM, David Storrs wrote: >>> >>> On Fri, Oct 13, 2017 at 2:50 PM, David Storrs >>> wrote: Coming from a Perl background, I've long had a convention of naming private functions with a leading underscore, e.g. _do-the-thing. Is there a standard Racket convention for this and, if so, what is it? >>> >>> Addendum: I know that I can define functions inside the function for >>> which they are the helper, but my understanding is that if I do that >>> then the helper function is recompiled every time the parent function >>> is executed. >>> >>> (define (flurble args) >>> (define (helper-func) ...do stuff...) >>> (helper-func ...)) >>> >>> (for ((i 1)) >>> (flurble i)) ; helper-func will be built 10,000 times, right? >> >> >> No it isn’t recompiled. But the run-time may allocate a closure a second >> time. >> Lambda lifting and similar techniques should avoid this but not necessarily >> in >> the current compiler. > > > (define (foo x) > (for ((i 1)) > (define (bar) x) > (bar))) > > So bar will be allocated 10,000 times in the above? How about baz and > jaz in the below? > > > (define (foo x) > (define (baz) 8) > (define (jaz) x) > (println (jaz)) > (baz)) > > (for ((i 1)) > (foo 7)) > > -- > You received this message because you are subscribed to the Google Groups > "Racket Users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to racket-users+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to racket-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: [racket-users] Re: Naming conventions for private functions
> On Oct 13, 2017, at 9:19 PM, David Storrs wrote: > > On Fri, Oct 13, 2017 at 2:57 PM, Matthias Felleisen > wrote: >> >>> On Oct 13, 2017, at 2:55 PM, David Storrs wrote: >>> >>> On Fri, Oct 13, 2017 at 2:50 PM, David Storrs >>> wrote: Coming from a Perl background, I've long had a convention of naming private functions with a leading underscore, e.g. _do-the-thing. Is there a standard Racket convention for this and, if so, what is it? >>> >>> Addendum: I know that I can define functions inside the function for >>> which they are the helper, but my understanding is that if I do that >>> then the helper function is recompiled every time the parent function >>> is executed. >>> >>> (define (flurble args) >>> (define (helper-func) ...do stuff...) >>> (helper-func ...)) >>> >>> (for ((i 1)) >>> (flurble i)) ; helper-func will be built 10,000 times, right? >> >> >> No it isn’t recompiled. But the run-time may allocate a closure a second >> time. >> Lambda lifting and similar techniques should avoid this but not necessarily >> in >> the current compiler. > > > (define (foo x) >(for ((i 1)) >(define (bar) x) >(bar))) > > So bar will be allocated 10,000 times in the above? How about baz and > jaz in the below? This kind of situation is covered by ‘lightweight closure’ conversion, which we added in the late 90s and should still be there. Note how all instances of bar are identical. No need to re-allocate. > > > (define (foo x) > (define (baz) 8) > (define (jaz) x) > (println (jaz)) > (baz)) > > (for ((i 1)) > (foo 7)) Again, baz is covered trivially. Only a whole-program analysis can confirm that foo is applied to only 7 and therefor jaz is the same closure on every call to foo. ;; - - - Note that programs can use eq? to compare closures. I am ignoring this aspect. -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to racket-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: [racket-users] Re: Naming conventions for private functions
On Fri, Oct 13, 2017 at 2:57 PM, Matthias Felleisen wrote: > >> On Oct 13, 2017, at 2:55 PM, David Storrs wrote: >> >> On Fri, Oct 13, 2017 at 2:50 PM, David Storrs wrote: >>> Coming from a Perl background, I've long had a convention of naming >>> private functions with a leading underscore, e.g. _do-the-thing. Is >>> there a standard Racket convention for this and, if so, what is it? >> >> Addendum: I know that I can define functions inside the function for >> which they are the helper, but my understanding is that if I do that >> then the helper function is recompiled every time the parent function >> is executed. >> >> (define (flurble args) >> (define (helper-func) ...do stuff...) >> (helper-func ...)) >> >> (for ((i 1)) >> (flurble i)) ; helper-func will be built 10,000 times, right? > > > No it isn’t recompiled. But the run-time may allocate a closure a second time. > Lambda lifting and similar techniques should avoid this but not necessarily in > the current compiler. (define (foo x) (for ((i 1)) (define (bar) x) (bar))) So bar will be allocated 10,000 times in the above? How about baz and jaz in the below? (define (foo x) (define (baz) 8) (define (jaz) x) (println (jaz)) (baz)) (for ((i 1)) (foo 7)) -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to racket-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: [racket-users] Re: Naming conventions for private functions
On Fri, Oct 13, 2017 at 2:59 PM, Robby Findler wrote: > Also: if you just don't `provide` a function from a module, then it > cannot be used outside. No naming conventions necessary. > Sure, but the underscore helps me know at a glance what I'm looking at, whether it's safe to make a breaking change to a function, etc. > Robby > > On Fri, Oct 13, 2017 at 1:57 PM, Matthias Felleisen > wrote: >> >>> On Oct 13, 2017, at 2:55 PM, David Storrs wrote: >>> >>> On Fri, Oct 13, 2017 at 2:50 PM, David Storrs >>> wrote: Coming from a Perl background, I've long had a convention of naming private functions with a leading underscore, e.g. _do-the-thing. Is there a standard Racket convention for this and, if so, what is it? >>> >>> Addendum: I know that I can define functions inside the function for >>> which they are the helper, but my understanding is that if I do that >>> then the helper function is recompiled every time the parent function >>> is executed. >>> >>> (define (flurble args) >>> (define (helper-func) ...do stuff...) >>> (helper-func ...)) >>> >>> (for ((i 1)) >>> (flurble i)) ; helper-func will be built 10,000 times, right? >> >> >> No it isn’t recompiled. But the run-time may allocate a closure a second >> time. >> Lambda lifting and similar techniques should avoid this but not necessarily >> in >> the current compiler. >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Racket Users" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to racket-users+unsubscr...@googlegroups.com. >> For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to racket-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
[racket-users] Re: Naming conventions for private functions
Robby Findler writes: > Also: if you just don't `provide` a function from a module, then it > cannot be used outside. No naming conventions necessary. But the no-naming convention is necessary. :-). -- --- Eric Eide . University of Utah School of Computing http://www.cs.utah.edu/~eeide/ . +1 (801) 585-5512 voice, +1 (801) 581-5843 FAX -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to racket-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: [racket-users] Re: Naming conventions for private functions
Also: if you just don't `provide` a function from a module, then it cannot be used outside. No naming conventions necessary. Robby On Fri, Oct 13, 2017 at 1:57 PM, Matthias Felleisen wrote: > >> On Oct 13, 2017, at 2:55 PM, David Storrs wrote: >> >> On Fri, Oct 13, 2017 at 2:50 PM, David Storrs wrote: >>> Coming from a Perl background, I've long had a convention of naming >>> private functions with a leading underscore, e.g. _do-the-thing. Is >>> there a standard Racket convention for this and, if so, what is it? >> >> Addendum: I know that I can define functions inside the function for >> which they are the helper, but my understanding is that if I do that >> then the helper function is recompiled every time the parent function >> is executed. >> >> (define (flurble args) >> (define (helper-func) ...do stuff...) >> (helper-func ...)) >> >> (for ((i 1)) >> (flurble i)) ; helper-func will be built 10,000 times, right? > > > No it isn’t recompiled. But the run-time may allocate a closure a second time. > Lambda lifting and similar techniques should avoid this but not necessarily in > the current compiler. > > -- > You received this message because you are subscribed to the Google Groups > "Racket Users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to racket-users+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to racket-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: [racket-users] Re: Naming conventions for private functions
> On Oct 13, 2017, at 2:55 PM, David Storrs wrote: > > On Fri, Oct 13, 2017 at 2:50 PM, David Storrs wrote: >> Coming from a Perl background, I've long had a convention of naming >> private functions with a leading underscore, e.g. _do-the-thing. Is >> there a standard Racket convention for this and, if so, what is it? > > Addendum: I know that I can define functions inside the function for > which they are the helper, but my understanding is that if I do that > then the helper function is recompiled every time the parent function > is executed. > > (define (flurble args) > (define (helper-func) ...do stuff...) > (helper-func ...)) > > (for ((i 1)) > (flurble i)) ; helper-func will be built 10,000 times, right? No it isn’t recompiled. But the run-time may allocate a closure a second time. Lambda lifting and similar techniques should avoid this but not necessarily in the current compiler. -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to racket-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
[racket-users] Re: Naming conventions for private functions
On Fri, Oct 13, 2017 at 2:50 PM, David Storrs wrote: > Coming from a Perl background, I've long had a convention of naming > private functions with a leading underscore, e.g. _do-the-thing. Is > there a standard Racket convention for this and, if so, what is it? Addendum: I know that I can define functions inside the function for which they are the helper, but my understanding is that if I do that then the helper function is recompiled every time the parent function is executed. (define (flurble args) (define (helper-func) ...do stuff...) (helper-func ...)) (for ((i 1)) (flurble i)) ; helper-func will be built 10,000 times, right? -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to racket-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.