【问题标题】:Scheme: Mysterious void in pattern match方案:模式匹配中的神秘空白
【发布时间】:2011-07-05 03:44:00
【问题描述】:

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

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

但是,当匹配此模式时,返回的是:

'(CLOSURE
  ENV
  (x)
  (lambda (ENV)
    ((CLOSURE
      ENV
      (x y)
      (lambda (ENV) ((+ x y))))))
  #<void>)

具体来说,我无法弄清楚“void”来自哪里。事实上,如果我包括以下行:

,(displayln (map annotate (map (lambda (x) (append `(,<param1> . ,<params>) (list x))) `(,<stmts>))))

打印出来:

((CLOSURE ENV (x y) (lambda (ENV) ((+ x y)))))

特别是没有“void”。

如果有人能告诉我问题出在哪里,将不胜感激。

谢谢。

【问题讨论】:

    标签: scheme pattern-matching racket void


    【解决方案1】:

    #&lt;void&gt; 是来自displayln 的返回值。 Scheme 和 Racket 的某些实现中的输出函数通常会在没有返回任何有意义的内容时返回。

    【讨论】:

    • Scheme 对输出函数有未指定的结果;在这种情况下,返回 #&lt;void&gt; 值的是 Racket
    • @Eli:是的,我猜;标准方案甚至没有#&lt;void&gt;,是吗?我会修正我的答案。
    • 是的,标准只是没有指定任何内容;有些实现为这个未指定的结果选择一个特定的值,有些选择返回一些其他值。
    • 我很困惑。当我包含 displayln 函数时,它会打印不带#void 的 map annotate 的结果。如果没有 displayln 函数,#void 会出现在模式匹配中。
    • @Schemer:当displayln 函数起作用时,你是如何包含它的? Racket REPL 不会打印出#&lt;void&gt; 值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    相关资源
    最近更新 更多