我正在编写一个函数注释,它经常使用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>)))))
感谢任何建议。
感谢。
答案 0 :(得分:1)
.
需要在列表中的最后一个元素之前(除了一些您没有使用的特定于Racket的语法)。请记住,列表的一般形式是(a b c . d)
,意思是(cons a (cons b (cons c d)))
。您可以使用,@<params>
来匹配列表中间的某些元素,但我不确定。