2011-02-27 33 views
1

我正在写一个函数注释,它使用match-lambda通常用递归调用来注释。这里是模式和匹配之一:Scheme:match-lambda语法错误

(`(,<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

“。”用于球拍和计划中以表示“不适当的名单”;即不以“空”结尾的利弊序列。所以,举例来说,

'(3 4 . 5) 

(cons 3 (cons 4 5)) 

的“点”用来表示一个速记:“我与列表类似的部分完成的;这里的终值,使用而不是“空”,因此,你不能在列表中的任何地方使用点,它必须在单个最终元素之前,在你的例子中,模式中的点位于一堆元素之前,而不仅仅是一个

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

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

(其实,你也可以使用点在球拍中间符号,但我敢肯定,这不是你想要做什么,在这里。)