2

例如,当我使用printflist 上的过程时'((2 t r d)),输出中的最后一行是

'(#<void>)

并且出现的次数'(#<void>)取决于嵌套列表的数量。你能帮我解释一下吗???

这是我的 printf 函数

(define counting 
  (lambda (lst)
    (if (null? lst)
        '()
        (printf "~a, ~s\n" (car lst) (length (cdr lst))))))

我尝试过其他程序,例如fprintf并使用此表格

(fprintf (current-output-port) "~a, ~s\n" (car lst) (length (cdr lst)))

同样的事情发生!

4

2 回答 2

1

AFAIK 在 Scheme 标准中没有这样的过程,因此您可能需要为具有它的实现添加标签。我知道racketprintf

A (display x)(和(printf x)球拍)通常不会显示,所以产生(#<void>)的结果不是问题。在 Scheme 中,每个过程都会计算一个值。为了说明这个尝试做:

(map display '(1 2 3 4))

它将返回一个包含 4 个未指定值的列表,因为 map 列出了结果。display(并且printf在球拍中)打印参数评估的结果,但不需要返回任何内容,因为标准没有说应该这样做。大多数实现通过返回一个未定义的对象来做到这一点,但有些实际上也返回了参数。它们的主要功能是做在屏幕上显示某些东西的副作用,并且它已经完成了。对于忽略返回值,您可以使用for-eachwhich is map 仅用于副作用。

(for-each display '(1 2 3 4))

当在 Scheme 中这么说时,每个过程都会返回一些东西,而您在 REPL 打印返回值时误读了输出,这是正常的。

于 2013-11-06T12:16:56.937 回答
0

你说'你的输出的最后一行是'(#<void>)- 这是因为你的 Scheme 环境正在显示 1)你想要打印的内容和 2)评估表达式的返回值。例如

> (list (display 1))
1(#<void>)

打印“1”,然后打印列表结果。由于您在交互式会话中输入,因此您将始终显示返回的值。您不能真正隐藏返回值,但是大多数方案会识别“未定义”返回值而不打印它。

> (display 1)
1

在上面,即使display返回#<void>解释器知道不显示它。

于 2013-11-06T14:53:17.537 回答