[plt-scheme] Stylistic (I hope!) question regarding driver loop
The body of a letrec is in tail-position wrt to the letrec, so you're
set on that score.
(FWIW, You can test this out yourself. This program:
(define (f x) (letrec ([x x]) (f 1)))
(f 1)
doesn't accumulate memory, but this one (for example):
(define (f x) (letrec ([x (f 1)]) x))
(f 1)
does. Watch out in the second case -- it allocates memory pretty
quickly and gets hard to break pretty quickly too.)
Robby
At Sat, 21 Jan 2006 11:31:24 -0800, Gregory Woodhouse wrote:
> I thought I might try experimenting with the "meta-circular"
> interpreter in SICP, perhaps implementing lazy evaluation rules or
> other language modifications. Well, I put together a little driver
> loop using letrec
>
> (letrec
> ((main-loop
> (lambda ()
> (begin
> (display ">> ")
> (let ((input-exp (read)))
> (unless (equal? input-exp '(exit))
> (let ((the-value
> (evaluate input-exp)))
> (begin
> (display the-value)
> (newline)))
> (main-loop))))))
> (evaluate
> (lambda (x) x)))
> (main-loop))
>
> and it seems to work just fine. My first concern was that a construct
> like this would chew up stack space, but then I thought it was just
> tail recursion so it shouldn't matter. But then I wonder if placing a
> call to main-loop in the body of a letrec like that makes any
> difference. Is this safe? Is there a better way to write it?
>
> ===
> Gregory Woodhouse
> gregory.woodhouse at sbcglobal.net
>
> "All truth passes through three stages: First, it is
> ridiculed. Second, it is violently opposed. Third,
> it is accepted as being self-evident."
> --Arthur Schopenhaur
>
>
>
> _________________________________________________
> For list-related administrative tasks:
> http://list.cs.brown.edu/mailman/listinfo/plt-scheme