'Objects' here refers to any kind of Scheme datum. (There is no implication of 'object orientation', i.e. object hierarchies or method dispatch.)
Let's make this as simple as possible in the beginning:
pairs
a symbol type tag
These values:
null
true
false
eof-object
will just be symbols.
type tags are symbols
integers: represent as lists of bits (booleans), with an 'integer' type tag
characters: integers with a 'character' type tag
strings: lists of characters, with a 'string' type tag.
symbols: strings, with a symbol type tag, interned (only one symbol object with the same string exists in the system at the same time)
Notice the recursive definition? Can this work?
records: lists with positional fields and a type tag.
Are e.g. integers records?
procedures: records with code pointer and environment (copied variable bindings)
Is there a problem with differentiation between basic types and record types? Yes, without introducing another idea at least. How can it be solved?
We won't implement floating point numbers, at first (but perhaps rational and complex numbers if anyone feels like applying the lessons from SICP).