【问题标题】:Perl 6 function argument syntax in the interpreter (REPL)解释器中的 Perl 6 函数参数语法 (REPL)
【发布时间】:2017-07-14 18:19:40
【问题描述】:

解释器中的参数语法似乎有些不一致。我正在使用最新的 Rakudo。请看以下终端输出:

$ perl6
To exit type 'exit' or '^D'
> say: "foo"
foo
> say("foo")
foo
> say "foo"
===SORRY!=== Error while compiling:
Two terms in a row
------> say⏏ "foo"
    expecting any of:
        infix
        infix stopper
        statement end
        statement modifier
        statement modifier loop
> 
$ perl6
To exit type 'exit' or '^D'
> say "foo"
foo
> say("foo")
foo
> say: "foo"
foo
> say "foo"
===SORRY!=== Error while compiling:
Two terms in a row
------> say⏏ "foo"
    expecting any of:
        infix
        infix stopper
        statement end
        statement modifier
        statement modifier loop
> 
$ 

似乎在您使用“:”或“()”提供参数后,您无法返回使用“”(即空格)来提供参数。

还是我错过了什么?

谢谢!!!

lisprog

【问题讨论】:

标签: function arguments raku


【解决方案1】:

say: "foo"

该行调用say 子例程。

相反,它声明了一个名为saystatement label,然后执行语句"foo"(什么都不做)。

在您的情况下它打印"foo" 的唯一原因是因为您将它输入到 REPL 中,它会自动打印每行最后一条语句的值。

如果你在普通程序中使用它,它实际上会抛出警告Useless use of constant string "foo" in sink context

say "foo" ===SORRY!=== Error while compiling: Two terms in a row ------> say⏏ "foo" expecting any of: infix infix stopper statement end statement modifier statement modifier loop

声明标签后,此范围内的符号say 不再引用具有该名称的内置子例程,而是引用您的自定义标签,使用这样的标签是语法错误.

不过,错误消息应该能很好地解释这一点。我已经 submitted a Rakudo ticket 了。

【讨论】:

  • 我明白了!谢谢短信!!总有一些东西
  • 抱歉 smls:还有一个问题。如果 say: "foo" 创建了一个标签,那么在 perl6 文档docs.perl6.org/routine/map 中这个语法怎么样,在方法映射之后你会看到一个 ":" ---> say ('hello', 1, 22/7 , 42, 'world').map: { .WHAT.perl } # 输出: «(Str Int Rat Int Str)␤» ;我正在尝试与 map 相同的语法。如何区分“:”作为标签和“:”作为调用参数的方式?谢谢。
  • @lisprogtor:当一个单词直接在语句的开头(不包括空格)时,它只是一个标签声明。
  • @lisprogtor:子程序调用不存在方法调用的冒号形式,因为它们已经有了更简单的无括号形式:say 42
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 2018-01-11
  • 1970-01-01
  • 2022-09-30
相关资源
最近更新 更多