【问题标题】:Scheme: match-lambda syntax error方案:匹配 lambda 语法错误
【发布时间】:2011-07-05 04:25:03
【问题描述】:

我正在编写一个函数 annotate,它经常使用 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>)))))

感谢任何建议。

谢谢。

【问题讨论】:

    标签: syntax scheme pattern-matching racket


    【解决方案1】:

    “。”在 Racket 和 Scheme 中用于表示“不适当的列表”;也就是说,不以“空”结尾的缺点对序列。所以,例如,

    '(3 4 . 5)
    

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

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

    查看您的示例,您似乎想在此处使用“...”语法,例如:

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

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

    【讨论】:

      猜你喜欢
      • 2017-08-10
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多