下面是使用 Rakudo 的 REPL 会话。
> my Int $x = 1
1
> dd $x
Int $x = 1
Nil
为什么Nil
输出的第二行有一个dd
?
> sub mydd( $foo ) { dd $foo; "hello" }
&mydd
> mydd $x
1
hello
Nil 是 的返回值dd
,或者准确地说没有返回值。
它不是“输出dd
”,而是基于dd
.
更详细...
REPL中的R读取您输入的行 ( )。dd ...
E评估该行。它是dd
,因此它打印以换行符结尾的行。
P打印另一行,也以换行符结尾。如果上一步中的评估未在 STDOUT 上产生输出,则此步骤生成的行包含该评估返回的值。
(然后L循环等待下一行输入。)
按 Enter 后看到的第一行是由 生成的输出dd
。
您看到的第二行是 REPL 生成的输出。
默认情况下,第二行的内容是.gist
由dd
. 返回的值dd
是 (always) Nil
。所以这就是你所看到的。
(自从发布此 SO 以来,Liz 添加了一个新的环境变量,让用户告诉 Rakudo 调用什么方法;.gist
现在只是默认值。)
Raku 中的 REPL 检查执行的代码是否对STDOUT
. 这样做的前提是,如果您的代码输出某些内容,您会对此感兴趣,而不是您刚刚执行的表达式的返回值。这就是为什么:
> say 42
42
只会显示42
而不显示(顺便说一句)的返回值。它不检查。检查这个:say
True
STDERR
note
> note 42
42
True
note
与 相同say
,但将其输出放在STDERR
而不是STDOUT
。这同样适用于dd
. 所以这就是为什么你也得到这个dd
:
> dd 42
42
Nil
除了 的实现dd
正在返回Nil
,因为它旨在作为一种调试辅助工具,应尽可能少地干扰其环境。