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.
 |