CSX
Си с S-выражениями
Это моя бакалаврская работа, в которой я описываю новый споосб встраивания Лиспа в Си с помощью библиотеки, позволяющей писать Лисп-выражения непосредственно выражениями Си.
Я думаю это интересный пример того, как даже простой и очень ограничивающий язык может оказаться достаточно гибким, что бы в его рамках подражать языку столь всепрощающему как Лисп.
Исходники доступны на GitHub. Саму работу можно прочитать тут.
Вкратце, все лисповские объекты представляются с помощью жирных указателей по void*
, а vararg-функции позволяют использовать привычную списочную нотацию Лиспа.
0 используется в качестве маркера конца списка, так как все объекты — это указатели; а валидный указатель быть 0 не может.
Библиотека позволяют писать такой код, смешивающий стили программирования на Си и Лиспе:
printf("%d\n", *(int *)E(L(S("+"), I(37), I(73), 0)));
Тут E
означает eval, L
— list, S
— symbol, а I
— integer.