Схема let * как вложенная унарная let - PullRequest
1 голос
/ 25 февраля 2011

В качестве упражнения я пытаюсь переписать строки, представляющие исходный код для 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 будет соответствовать списку выражений, поэтому я не могуПридумайте причину, по которой пункты также не будут этого делать.

1 Ответ

2 голосов
/ 25 февраля 2011

Вам понадобится . ,<clauses>, поскольку вы хотите сопоставить остальную часть списка, а не только один элемент.,<exprs> часть должна быть . ,<exprs> по той же причине.Я считаю, что есть другой синтаксис специально для сопоставления списков, но использование . просто и соответствует тому, как списки реализованы внутри.

...