LispBM can encode values of 4 different types into the `car`

or `cdr`

of a cons-cell. How this works can be found in the earler walkthrough of lispBM. The 4 types that can be encoded are, `symbol`

, `character`

, `integer`

and `unsigned integer`

. All of these types are 28Bit.

To be able to express computations on 32Bit values, `integer`

, `unsigned integer`

and `float`

as well as arrays, a set of *boxed* types were introduced.

The boxed values, except arrays, are stored in cons cells but have an extra level of indirection in the form of a typed pointer. Since the lisp heap is small there are unused bits on the most significant side. The 4 most significant bits are used to encode different typed pointers. Currently the following kinds of typed pointers are in use:

```
#define PTR_TYPE_CONS 0x10000000u
#define PTR_TYPE_BOXED_I 0x20000000u
#define PTR_TYPE_BOXED_U 0x30000000u
#define PTR_TYPE_BOXED_F 0x40000000u
#define PTR_TYPE_ARRAY 0xD0000000u
```

As an example, a float value is encoded as a cons cell where all the 32Bits of the `car`

are used for the floating point value. The `cdr`

of this cell contail a special symbol `DEF_REPR_BOXED_F_TYPE`

. The special symbols used in the `cdr`

position of boxed values are listed below.

```
#define DEF_REPR_ARRAY_TYPE 0x20FFFF
#define DEF_REPR_BOXED_I_TYPE 0x21FFFF
#define DEF_REPR_BOXED_U_TYPE 0x22FFFF
#define DEF_REPR_BOXED_F_TYPE 0x23FFFF
```

Only the `cdr`

field of a cons cell hold a GC bit so there is no problem in using all 32Bits of the `car`

if only it can be identified properly.

Arrays are a special case and not fully implemented yet. Currently the only thing that is an array in lispBM is a text string. Most of the plumbing is there for implementing arrays of any other lispBM value type, it just needs to be hacked up. Arrays are encoded in a very similar way to boxed values, just that instead of a 32Bit value in the `car`

slot there is an arbitrary pointer. The array storage itself is allocated using `malloc`

. When garbage collection frees a cons cell with the special symbol `DEF_REPR_ARRAY_TYPE`

, it also calls `free`

on the pointer in the `car`

position.

Please contact me with questions, suggestions or feedback at blog (dot) joel (dot) svensson (at) gmail (dot) com or join the google group .

© Copyright 2020 Bo Joel Svensson

This page was generated using Pandoc.