Я пытаюсь написать несколько макросов для программирования ограничений на целые числа и, в частности, я пытаюсь раскрыть
(int-constr (x y z)
(< 10
(+
(* x 4)
(* y 5)
(* z 6)))
(> 10
(+
(* x 1)
(* y 2)
(* z 3))))
в
(let ((x (in-between 0 1))
(y (in-between 0 1))
(z (in-between 0 1)))
(assert
(and (< 10
(+
(* x 4)
(* y 5)
(* z 6)))
(> 10
(+
(* x 1)
(* y 2)
(* z 3)))))
(list x y z))
При рекурсивном использовании синтаксических правил я могу создавать вложенные let в начале, но я думаю, что теряю возможность вызова списка аргументов в конце. Есть ли способ сделать это?