Сопоставление шаблонов схемы с помощью match-лямбда

Я пишу функцию под названием annotate, которая использует match-лямбда, часто с рекурсивными вызовами для аннотирования. Вот одно из совпадений шаблона:

(`(lambda (,<param1> . ,<params>) ,<stmts>)
        `(CLOSURE ENV (,<param1> . ,<params>) `(lambda (ENV) ,(map annotate ,(list-append `(,<param1> . ,<params>) `(,<stmts>))))))

list-append просто создает новые списки из двух своих аргументов. Проблема в том, что когда этот шаблон соответствует, он возвращает что-то вроде:

'(CLOSURE
  ENV
  (x)
  `(lambda (ENV)
     ,(map
       annotate
       (<results of list-append>))))

В частности, ",(аннотация карты" печатается буквально, а не оценивается, даже если она не заключена в кавычки. Другие шаблоны в функции, по-видимому, используют точно такой же синтаксис без этой проблемы. Кроме того, функция list-append без кавычек выполняется без проблемы.

Любые советы приветствуются.


person Schemer    schedule 27.02.2011    source источник


Ответы (1)


У вас есть вложенные обратные кавычки: у вас есть одна перед CLOSURE, а затем вторая перед второй lambda без запятой между ними: обратите внимание на буквальную обратную кавычку в середине вашего вывода. Я думаю, что удаление обратной кавычки перед вторым lambda решит проблему.

person Jeremiah Willcock    schedule 27.02.2011
comment
Я попробовал это, и он жалуется, что не цитируемый ранее (list-append не находится в квази-кавычках. - person Schemer; 27.02.2011
comment
Вам нужно убрать запятую там; map annotate будет находиться за пределами квазикавычек (поскольку вы хотите запустить его), поэтому вам не нужно снимать кавычки внутри него. - person Jeremiah Willcock; 27.02.2011
comment
Ах, list-append в конце концов не нужно брать в кавычки. Еще раз спасибо. - person Schemer; 27.02.2011