Схема: синтаксис сопоставления с образцом - PullRequest
0 голосов
/ 07 марта 2011

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

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

используя match-lambda и возвращать что-то вроде этого:

(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.

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

Спасибо.

1 Ответ

1 голос
/ 07 марта 2011

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

[`(lambda (,<param> . ,<params>) . ,<stmts>)
 (list 'CLOSURE 'ENV (list 'quote (cons <param> <params>)) 
       (list 'lambda '(ENV) <stmts>))]
...