Я использую match-lambda для переписывания определенных функций в терминах более простых. Вот пример, который принимает строки, представляющие входной код для вызовов let *, и возвращает их в виде строк, преобразованных во вложенные унарные let:
(define let*→nested-unary-lets
(match-lambda
(`(let* (()) ,<exprs>)
`(let () ,<exprs>))
(`(let* ((,<var> ,<val>)) ,<exprs>)
`(let ((,<var> ,<val>)) (let () ,<exprs>)))
(`(let* ((,<var> ,<val>) . ,<clauses>) ,<exprs>)
`(let ((,<var> ,<val>)) (let*→nested-unary-lets '(let* (,@<clauses>) ,<exprs>))))))
Вот пример вызова let * → nested-unary-let:
(let*→nested-unary-lets '(let* ((a 1) (b (+ a 1)) (c (+ a b))) (displayln c)))
'(let ((a 1))
(let*→nested-unary-lets
'(let* ((b (+ a 1)) (c (+ a b)))
(displayln c))))
Мне было интересно, есть ли какой-нибудь способ заставить вычисление рекурсивного вызова позволить * → nested-unary-let, чтобы выходная строка содержала только вложенные let и не требовала дальнейшей оценки.
Спасибо.