我正在编写一个名为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>)
具体来说,我无法弄清楚“无效”的来源。事实上,如果我包括这一行:
,(displayln (map annotate (map (lambda (x) (append `(,<param1> . ,<params>) (list x))) `(,<stmts>))))
打印:
((CLOSURE ENV (x y) (lambda (ENV) ((+ x y)))))
特别是没有“无效”。
如果有人能告诉我这是什么问题,我们将不胜感激。
感谢。
答案 0 :(得分:2)
#<void>
是displayln
的返回值。 Scheme和Racket的一些实现中的输出函数通常在没有任何有意义的返回时返回。