То, что вы в основном делаете, - это пишите начало диспетчера памяти для интерпретатора Lisp, объединяя элементы вектора в cons-ячейки. Вот что я сейчас бросил в Си:
#include <stdbool.h>
#include <iso646.h>
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#define MEMORY_SIZE 1024
#define NIL 0
#define IVAL_MASK 0x8000000
struct pair
{
bool allocated;
size_t first;
size_t second;
};
size_t allocate_pair(struct pair vector[])
{
for (size_t i = 1; i < MEMORY_SIZE; i++)
{
if (not vector[i].allocated)
{
vector[i].allocated = true;
return i;
}
}
return NIL;
}
size_t make_pair(struct pair vector[], size_t a, size_t b)
{
size_t the_pair = allocate_pair(vector);
if (the_pair != NIL)
{
vector[the_pair].first = a;
vector[the_pair].second = b;
return the_pair;
}
else
{
fprintf(stderr,
"Out of pairs -- make_pair(%p, %zu, %zu)",
vector,
a,
b);
exit(EXIT_FAILURE);
}
}
size_t first(struct pair vector[], size_t index)
{
assert(vector[index].allocated);
return vector[index].first;
}
size_t second(struct pair vector[], size_t index)
{
assert(vector[index].allocated);
return vector[index].second;
}
void print_pair_aux(struct pair[], size_t, size_t);
void print_pair(struct pair vector[], size_t p)
{
assert(vector[p].allocated);
size_t a = first(vector, p);
size_t b = second(vector, p);
printf("(");
print_pair_aux(vector, a, b);
printf(")");
}
void print_pair_aux(struct pair vector[], size_t a, size_t b)
{
if (a == NIL)
printf("NIL");
else if (a >= IVAL_MASK)
printf("%zu", a &~ IVAL_MASK);
else
print_pair(vector, a);
if (b == NIL)
printf("");
else if (b >= IVAL_MASK)
printf(" . %zu", b &~ IVAL_MASK);
else
{
printf(" ");
print_pair_aux(vector,
first(vector, b),
second(vector, b));
}
}
int main(void)
{
struct pair *vector = calloc(MEMORY_SIZE, sizeof *vector);
#define cons(A,B) make_pair(vector, (A), (B))
#define ival(x) ((x) | IVAL_MASK)
size_t a = cons(ival(3), cons(ival(4), NIL));
size_t b = cons(ival(2), cons(a, NIL));
size_t c = cons(ival(6), cons(ival(7), cons(ival(8), NIL)));
size_t d = cons(ival(5), cons(c, NIL));
size_t e = cons(ival(1), cons(b, cons(d, NIL)));
print_pair(vector, e);
puts("");
}
$ cc -std=c99 try.c
$ ./a.out
(1 (2 (3 4)) (5 (6 7 8)))