2011-02-27 34 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]) 

(其實,你也可以使用點在球拍中間符號,但我敢肯定,這不是你想要做什麼,在這裏。)