42 lines
2.2 KiB
Plaintext
42 lines
2.2 KiB
Plaintext
|
- readable gensyms. have uninterned symbols, but have all same-named
|
||
|
gensyms read to the same (eq) symbol within an expression.
|
||
|
- fat pointers, i.e. 64 bits on 32-bit platforms. we could have full 32-bit
|
||
|
integers too. the mind boggles at the possibilities.
|
||
|
(it would be great if everybody decided that pointer types should forever
|
||
|
be wider than address spaces, with some bits reserved for application use)
|
||
|
- any way at all to provide O(1) computed lookups (i.e. indexing).
|
||
|
CL uses vectors for this. once you have it, it's sufficient to get
|
||
|
efficient hash tables and everything else.
|
||
|
- could be done just by generalizing cons cells to have more than
|
||
|
car, cdr: c2r, c3r, etc. maybe (1 . 2 . 3 . 4 . ...)
|
||
|
all you need is a tag+size on the front of the object so the collector
|
||
|
knows how to deal with it.
|
||
|
(car x) == (ref x 0), etc.
|
||
|
(rplaca x v) == (rplac x 0 v), etc.
|
||
|
(size (cons 1 2)) == 2, etc.
|
||
|
- one possibility: if we see a cons whose CAR is tagptr(0x10,TAG_SYM),
|
||
|
then the CDR is the size and the following words are the elements.
|
||
|
. this approach is especially good if vectors are separate types from
|
||
|
conses
|
||
|
- another: add u_int32_t size to cons_t, making them all 50% bigger.
|
||
|
access is simpler and more uniform, without fully doubling the size like
|
||
|
we'd get with fat pointers.
|
||
|
|
||
|
Notice that the size is one byte more than the number of characters in
|
||
|
the string. This is because femtoLisp adds a NUL terminator to make its
|
||
|
strings compatible with C. No effort is made to hide this fact.
|
||
|
But since femtoLisp tracks the sizes of cvalues, it doesn't need the
|
||
|
terminator itself. Therefore it treats zero bytes specially as rarely
|
||
|
as possible. In particular, zeros are only special in values whose type
|
||
|
is exactly <tt>(array char)</tt>, and are only interpreted in the
|
||
|
following cases:
|
||
|
<ul>
|
||
|
<li>When printing strings, a final NUL is never printed. NULs in the
|
||
|
middle of a string are printed though.
|
||
|
<li>String constructors NUL-terminate their output.
|
||
|
<li>Explicit string functions (like <tt>strlen</tt>) treat NULs the same
|
||
|
way equivalent C functions would.
|
||
|
</ul>
|
||
|
Arrays of uchar, int8, etc. are treated as raw data and zero bytes are
|
||
|
never special.
|