Scheme:match-lambda语法错误

时间:2011-02-27 07:59:50

标签: syntax scheme pattern-matching racket

我正在编写一个函数注释,它经常使用match-lambda和annotate的递归调用。这是模式和匹配之一:

(`(,<param> . ,<params> (lambda (,<args>) ,<stmt> . ,<stmts>))
 `(CLOSURE ENV ,(append (append `(,<param>) `(,<params>))`(,<args>)) (lambda (ENV) ,(map annotate `(,<stmt> . ,<stmts>)))))

我收到的投诉是第一次使用“。”是非法的 - 在“param”和“params”之间 - 但我无法弄清楚为什么。这种模式和匹配没有任何抱怨,看起来与第一个“。”非常相似:

(`(λ (,<param1> . ,<params>) ,<stmt> . ,<stmts>)
 `(CLOSURE ENV ,(map annotate `(,<param1> . ,<params>)) (λ (ENV) ,(map annotate `(,<stmt> . ,<stmts>)))))

感谢任何建议。

感谢。

1 个答案:

答案 0 :(得分:1)

.需要在列表中的最后一个元素之前(除了一些您没有使用的特定于Racket的语法)。请记住,列表的一般形式是(a b c . d),意思是(cons a (cons b (cons c d)))。您可以使用,@<params>来匹配列表中间的某些元素,但我不确定。