为什么 Rakudo dd 为键入和分配的标量返回 Nil?

Ros*_*ill 10 rakudo raku

下面是使用 Rakudo 的 REPL 会话。

> my Int $x = 1
1
> dd $x
Int $x = 1
Nil
Run Code Online (Sandbox Code Playgroud)

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

Hol*_*lli 9

> sub mydd( $foo ) { dd $foo; "hello" }
&mydd
> mydd $x
1
hello
Run Code Online (Sandbox Code Playgroud)

Nil 是 的返回值dd,或者准确地说是缺少返回值。


rai*_*iph 7

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

更详细...

  • [RREPL读取输入线(dd ...)。

  • Ë评估线。它是dd,所以它打印一行以换行符结尾。

  • P打印另一行,在新行也结束。如果上一步中的评估未在 STDOUT 上产生输出,则此步骤产生的行包括该评估返回的值。

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

按 Enter 后您看到的第一行是由dd.

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

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

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


Eli*_*sen 7

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

> say 42
42
Run Code Online (Sandbox Code Playgroud)

将只显示42还显示的返回值say(这恰好是TrueBTW)。它并没有检查STDERR。检查这个note

> note 42
42
True
Run Code Online (Sandbox Code Playgroud)

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

> dd 42
42
Nil
Run Code Online (Sandbox Code Playgroud)

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