В качестве упражнения я пытаюсь переписать строки, представляющие исходный код для 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* ((,<var> ,<val>) ,<clauses>) ,<exprs>)
не соответствует строке типа:
'(let* ((a b) (c d) (e f)) <expressions>)
Термин пункты соответствует только второму пункту (c d)
.Мне кажется, что все остальные пункты (var val)
должны быть представлены в виде списка ((c d) (e f))
.Во всяком случае, мне это нужно.
Любой совет приветствуется.
Меня сбивает с толку, что exprs будет соответствовать списку выражений, поэтому я не могуПридумайте причину, по которой пункты также не будут этого делать.