Немного боюсь приступать к последнему упражнению из текущего раздела :lain_lurk:
В связи с этим активно прокрастинирую, погружаясь в абсолютно нерелевантную для SICP тему: макросы. Возможно, они появятся позже, но у меня чесались руки написать нормальную функцию для прогона тестов, чтобы не пиать каждый раз print и сопоставлять с результатом. Что (не)характерно, у меня получилось, и выглядит довольно красиво. Примерно вот такой вывод в случае успеха:
OK (+ 2 3): = 5 5
И вот такой в случае неудачи:
FAIL: (+ 2 2): expected 5, got 4
Кстати, создается впечатление, что в Scheme макросы более комплексные, чем в Common Lisp: имеется несколько "трансформеров", которые, если я правильно понимаю (а я пока что очень слабо понимаю) по-разному взаимодействуют с вызывающей средой. Благо, мне пока что хватило самой примитивной конструкции.
Ну класс, макросы по каким-то причинам отказываются вызываться из скомпилированной библиотеки.
Круто, что Chicken Scheme умеет собирать .so, но вот, видимо, макросы -- часть синтаксиса, а в библиотеке ожидаются функции.
Если так подумать -- то логично. Макросы же разворачиваются на этапе компиляции, так что в библиотеке их отсутствие логично.
Надо придумать, как можно из этого выкрутиться.