开发者

Scheme: match-lambda syntax error

I am writing a function annotate that uses match-lambda often with recursive calls to annotate. Here is one of the patterns and matches:

(`(,<param> . ,<params> (lambda (,<args>) ,<stmt> . ,<stmts>))
 `(CLOSURE ENV 开发者_如何学C,(append (append `(,<param>) `(,<params>))`(,<args>)) (lambda (ENV) ,(map annotate `(,<stmt> . ,<stmts>)))))

I am getting a complaint that the first use of "." is illegal -- between "param" and "params" -- but I can't figure out why. This pattern and match doesn't get any complaints and seems very similar with regards to the first ".":

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

Any advice is appreciated.

Thanks.


The "." is used in Racket and in Scheme to represent "improper lists"; that is, sequences of cons pairs that don't end with "empty". So, for instance,

'(3 4 . 5)

is a shorthand for

(cons 3 (cons 4 5))

The 'dot' is used to mean: "I'm done with the list-like part; here's the final value, use this instead of "empty". For this reason, you can't use the dot just anywhere in the list; it has to be just before a single, final element. In your example, the dot in the pattern precedes a bunch of elements, not just one.

Looking at your example, it looks you want to use the "..." syntax here, e.g.:

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

(Actually, you can also use dots for infix notation in Racket, but I'm pretty sure that's not what you're trying to do, here.)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜