Схема: синтаксис сопоставления с образцом

Мне нужно иметь возможность сопоставлять такие шаблоны:

(lambda (<param> ...) <stmt> ...)

используя match-лямбда, и верните что-то вроде этого:

(CLOSURE ENV '(<param> ...) (λ (ENV) <stmt> ...)

где указан список параметров.

Самое близкое, что я могу получить, это:

(`(lambda (,<param> . ,<params>) . ,<stmts>) 
 `(CLOSURE ENV (,<param> . <params>) (lambda (ENV) (,@<stmts>))))

Например, '(lambda (ls1 ls2) (append ls1 ls2))) возвращает:

'(CLOSURE
  ENV
  (ls1 ls2)
  (lambda (ENV) ((append ls1 ls2))))

но я не могу получить список параметров в кавычках.

В ответах на предыдущие сообщения мне сказали, что "." в шаблоне должен предшествовать последнему элементу в списке. Однако я обнаружил, что это неправильно. Например:

(define function-call
  (match-rewriter
   (`(,<func> . ,<args>)
    `(CALL ,<func> (list ,@<args>)))) (+ 1 2) )

возвращает:

'(CALL + (list 1 2))

где args явно соответствует как 1, так и 2.

Если кто-нибудь может дать мне несколько советов о том, как исправить этот шаблон, я был бы очень признателен.

Спасибо.


person Schemer    schedule 07.03.2011    source источник
comment
Привет; относительно вашего комментария (мой комментарий) о размещении точки: дело в том, что точка должна предшествовать не более чем одному элементу шаблона, как здесь.   -  person John Clements    schedule 07.03.2011
comment
О, я вижу. Спасибо, что связались со мной.   -  person Schemer    schedule 08.03.2011


Ответы (1)


Вам нужно поместить ' буквально в вывод. Это может быть сложно при использовании quasiquote, поэтому я буду избегать этого в своем ответе. Вот шаблон и правая сторона, которую вы хотите:

[`(lambda (,<param> . ,<params>) . ,<stmts>)
 (list 'CLOSURE 'ENV (list 'quote (cons <param> <params>)) 
       (list 'lambda '(ENV) <stmts>))]
person Sam Tobin-Hochstadt    schedule 07.03.2011
comment
Ой ну спасибо. Я думал, что мне нужно использовать квазицитаты в сопоставлении с образцом, и вставка цитаты сама ни к чему меня не привела. - person Schemer; 08.03.2011