【问题标题】:Scheme pattern matching with match-lambda与 match-lambda 匹配的方案模式
【发布时间】:2011-07-05 03:15:51
【问题描述】:

我正在编写一个名为 annotate 的函数,该函数使用 match-lambda,通常使用递归调用 annotate。这是模式匹配之一:

(`(lambda (,<param1> . ,<params>) ,<stmts>)
        `(CLOSURE ENV (,<param1> . ,<params>) `(lambda (ENV) ,(map annotate ,(list-append `(,<param1> . ,<params>) `(,<stmts>))))))

list-append 只是从它的两个参数中创建新列表。问题是,当此模式匹配时,它会返回如下内容:

'(CLOSURE
  ENV
  (x)
  `(lambda (ENV)
     ,(map
       annotate
       (<results of list-append>))))

具体来说,“,(map annotate”按字面意思打印而不是被评估——即使它没有被引用。函数中的其他模式似乎使用完全相同的语法而没有这个问题。此外,未引用的函数 list-append执行没有问题。

感谢任何建议。

【问题讨论】:

    标签: scheme pattern-matching racket


    【解决方案1】:

    您有嵌套的反引号:CLOSURE 前面有一个,然后第二个 lambda 前面有第二个,中间没有逗号:注意输出中间的文字反引号。我认为在第二个 lambda 之前删除反引号将解决问题。

    【讨论】:

    • 我试过了,它抱怨“(list-append”之前的取消引用不在准引用中。
    • 这里需要去掉逗号; map annotate 将在一个 quasiquote 之外(因为你想运行它),所以你不需要取消引用它里面的东西。
    • 啊,list-append 毕竟不需要不加引号。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多