10

下面是使用 Rakudo 的 REPL 会话。

> my Int $x = 1
1
> dd $x
Int $x = 1
Nil

为什么Nil输出的第二行有一个dd

4

3 回答 3

9
> sub mydd( $foo ) { dd $foo; "hello" }
&mydd
> mydd $x
1
hello

Nil 是 的返回值dd,或者准确地说没有返回值。

于 2020-05-20T22:38:21.810 回答
7

它不是“输出dd”,而是基于dd.

更详细...

  • REPL中的R读取您输入的行 ( )。dd ...

  • E评估该行。它是dd,因此它打印以换行符结尾的行。

  • P打印另一行,也以换行符结尾。如果上一步中的评估未在 STDOUT 上产生输出,则此步骤生成的行包含该评估返回的值。

  • (然后L循环等待下一行输入。)

按 Enter 后看到的第一行是由 生成的输出dd

您看到的第二行是 REPL 生成的输出。

默认情况下,第二行的内容是.gistdd. 返回的值dd是 (always) Nil。所以这就是你所看到的。

(自从发布此 SO 以来,Liz 添加了一个新的环境变量,让用户告诉 Rakudo 调用什么方法;.gist现在只是默认值。)

于 2020-05-21T00:33:44.600 回答
7

Raku 中的 REPL 检查执行的代码是否对STDOUT. 这样做的前提是,如果您的代码输出某些内容,您会对此感兴趣,而不是您刚刚执行的表达式的返回值。这就是为什么:

> say 42
42

只会显示42而不显示(顺便一句)的返回值。它检查。检查这个:sayTrueSTDERRnote

> note 42
42
True

note与 相同say,但将其输出放在STDERR而不是STDOUT。这同样适用于dd. 所以这就是为什么你也得到这个dd

> dd 42
42
Nil

除了 的实现dd正在返回Nil,因为它旨在作为一种调试辅助工具,应尽可能少地干扰其环境。

于 2020-05-21T10:36:42.427 回答