2017-07-14 52 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