Можно создать чистый язык FP с использованием единой структуры данных:
typedef enum record_type { RT_SYMBOL, RT_NUMBER, RT_PAIR };
struct record
{
record_type type;
void *value;
};
Программы и данные могут быть представлены с использованием pairs
из records
:
struct pair
{
record *car;
record *cdr;
};
Вот как простое выражение - 2 * 3
- может быть представлено с использованием records
:
record r1;
r1.type = RT_NUMBER;
r1.value = &two;
record r2;
r1.type = RT_NUMBER;
r1.value = &three;
record opr1;
opr1.type = RT_NUMBER;
opr1.value = &OP_MULT; /* A machine op-code for multiplication. */
pair p_oprnds;
p_oprnds.car = &r1;
p_oprnds.cdr = &r2;
pair p;
p.car = opr1;
p.cdr = p_oprnds;
Это то же самое, что выражение Lisp: (* 2 3)
.Теперь вы можете определить машину, которая работает на pairs
, рассматривая car
как оператор и cdr
как операнды.Поскольку мы имеем дело только с одной структурой данных, возможен точный GC.См. Lispkit Lisp для архитектуры такой виртуальной машины.
Также прочитайте Lisp маленькими кусочками перед тем, как начать с серьезной попытки написания компилятора FP -> C.