[racket] Writing a toy interpreter. Need help solving this bootstrapping problem.

From: Hendrik Boom (hendrik at topoi.pooq.com)
Date: Wed Feb 16 23:25:24 EST 2011

On Wed, Feb 16, 2011 at 11:07:49PM -0500, Patrick Li wrote:
> Hello everyone,
> 
> I'm writing a toy Scheme-ish interpreter for fun, and am trying to add some
> Smalltalk flavor to my Scheme system. I'm running into a bootstrapping
> problem though, and would like to ask someone for a nudge in the right
> direction.
> 
> (1) I want symbols to be represented as Functions.
> ie. I want to be able to do this:
> ('my-symbol 'length) returns 9
> ('my-symbol 'equals 'my-symbol2) returns false
> 
> (2) I want symbols to be created by calling the function SYMBOL:
> (SYMBOL 'new <internal-symbol-representation>) returns a new function
> representing a symbol
> 
> (3) I want users to be able to override the built-in SYMBOL function.
> (define SYMBOL (lambda args .... new symbol definition ....))
> 
> I can't seem to write a system like this without falling into an infinite
> loop somewhere.
> 
> For example this is the last one that I ran into:
> 
> i. (quote asdf) is a special form that should create a symbol by calling
> (SYMBOL 'new <internal-object-which-represents-asdf>)
> 
> ii. But doing that requires creating the 'new symbol
> 
> iii. Creating the 'new symbol requires calling
> (SYMBOL 'new <internal-object-which-represents-new>)
> 
> iv. But doing that requires creating the 'new symbol
> 
> and so on.
> 
> 
> I apologize if this seems unclear. Please ask me for clarifications if I
> didn't explain myself properly. I have been stuck on this sort of problem
> for a while now, and can't wrap my head around it.
>   -Patrick

When you find you need to have implemented something in order to 
implement itself within your sustem, it's a strong clue that it has to 
be built into the system, rather than built on top of it..  In this 
case, the symbol 'new, will have to be in the system to stat with, i.e., 
written in whatever othe system you bootstrap from.

-- hendrik


Posted on the users mailing list.