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.