2017-07-14 51 views
4

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

$ 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

+0

我之前做过类似的错误(请参阅[在Perl 6中使用方法和函数调用中的冒号](https://stackoverflow.com/questions/30982697/use-of-colon-in-method-andfunction -calls-in-perl-6)) –

回答

9

say: "foo"

那行不调用子程序say

相反,它声明statement label的名称为say,然后执行语句"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

+0

我明白了!谢谢你!总是有东西 – lisprogtor

+1

抱歉smls:只是一个问题。如果说:“foo”创建了一个标签,那么在perl6文档https://docs.perl6.org/routine/map中,如果在方法映射之后看到“:”,那么怎么说呢?>说('hello',1,22/7,42,'world')。map:{.WHAT.perl}#OUTPUT:«(Str Int Int Rat Int Str)␤»;我正在尝试与map相同的语法。如何区分“:”作为标签从“:”作为调用参数的方式?谢谢。 – lisprogtor

+1

@lisprogtor:这只是一个标签声明,当一个单词后跟一个冒号**时,直接在语句开头**(不包括空格)。 – smls