Adding loop primitives/optimizations (was Making Set/Dictionaryetc. loops more robust)

Richard A. O'Keefe ok at cs.otago.ac.nz
Thu Dec 2 04:11:00 UTC 2004


"Joshua Scholar" <jscholar at access4less.net> wrote:
	I was thinking about iteration and closures the other day.  Smalltalk blocks
	are becoming the equivalent of lambdas, but in Scheme, the block inside of a
	loop does not have to be a lambda, and can use the outer environment I
	think...  So when we slow our loops down in order to create a new
	environment for each iteration, we're doing something that Scheme and Lisp
	didn't I think.  I'll have to write some Scheme programs to be sure.
	
As an old Lisper I must say I find his description of Scheme unrecognisable.
The basic loop form in Scheme is named-LET:

    (let <name> ((<v1> <e1>) ... (<vn> <en>)) <body>)

which is precisely equivalent to

    (letrec ((<name> (lambda (<v1> ... <vn>) <body>)))
      (<name> <e1> ... <en>))

"do" is also defined in terms of rewriting to a recursive "lambda".
"In Scheme, the block inside a loop" _is_ (the body of) "a lambda".
It "can use the outer environment" because so can all lambdas in Scheme.
And so, of course, can blocks in Smalltalk.
Scheme _does_ create a new environment (in principle) for each loop
_entry_ but not for each loop _iteration_.
And so does Smalltalk.  Squeak does *NOT* "slow our loops down in order
to create a new environment for each iteration".




More information about the Squeak-dev mailing list