
Kevin S. Millikin wrote:
It sure looks like the example contradicts the assertion, but I happen to know that there is a set! (or some other assignment) in the macro expansion of define. I'm just using call/cc to get at that, rather than getting at the one in the expansion of letrec.
In Scheme 'define' is normally a primitive because in most of the systems a top-level 'define' must create a top-level variable binding, and there is no other R5RS form that can do that. Still, you're right about set!. R5RS says: "5.2.1. Top level definitions At the top level of a program, a definition (define variable expression) has essentially the same effect as the assignment expression (set! variable expression) if variable is bound. If variable is not bound, however, then the definition will bind variable to a new location before performing the assignment... Some implementations of Scheme use an initial environment in which all possible variables are bound to locations, most of which contain undefined values. Top level definitions in such an implementation are truly equivalent to assignments." Similarly, R5RS obligates any Scheme implementation to resort to assignments when processing a letrec form. An implementation may not use a (polyvariadic) Y to implement letrec, unless the implementation can prove that the difference is unobservable for the form in question. Incidentally, one can easily observe how letrec is implemented. For example, in Ocaml, the observation says that "let rec" is implemented via an assignment. So, in the examples mentioned earlier, call/cc simply pries open the assignment that was already present in letrec or define. Alone, call/cc cannot emulate assignments. There was a message exactly on the same topic "call/cc is insufficient to emulate set!" posted on comp.lang.scheme two years ago: http://google.com/groups?selm=200103010316.TAA30239%40adric.cs.nps.navy.mil Threads http://google.com/groups?threadm=200102212311.PAA76922%40adric.cs.nps.navy.m... http://google.com/groups?threadm=200102212321.PAA76933%40adric.cs.nps.navy.m... http://google.com/groups?threadm=200102220358.TAA77339%40adric.cs.nps.navy.m... might also be useful.