Scheme:match-lambda语法错误

时间:2011-02-27 09:42:15

标签: 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和Scheme中用于表示“不正确的列表”;也就是说,cons对的序列不以“空”结尾。所以,例如,

'(3 4 . 5)

的简写
(cons 3 (cons 4 5))

'dot'用于表示:“我完成了类似列表的部分;这是最终值,使用此而不是”空“。因此,您无法在任何地方使用点在列表中;它必须在单个最终元素之前。在您的示例中,模式中的点位于一堆元素之前,而不仅仅是一个元素。

看看你的例子,看起来你想在这里使用“...”语法,例如:

(match '(a b c d e)
  [`(,x ... d e) 'ok])

(实际上,你也可以在Racket中使用圆点作为中缀符号,但我很确定这不是你想要做的,在这里。)