我有两个Perl 6文件:
hello.p6:
sub hello
{
say 'hello';
}
Run Code Online (Sandbox Code Playgroud)
和main.p6:
require 'hello.p6';
hello();
Run Code Online (Sandbox Code Playgroud)
但是不要工作.如何在主脚本中包含第一个文件?
Clickbaity标题,但它太多了,不能放弃.我有这个运算符,我希望是正确的关联:
sub infix:<?> ( Int:D \n, Int:D \m --> Int:D )
is assoc<right>
is equiv(&infix:<**>)
{ n ** m }
put "2**2**2**2 = ", 2**2**2**2;
put "2?2?2?2 = ", 2?2?2?2;
put "2? (2? (2?2) ) = ", 2? (2? (2?2) );
Run Code Online (Sandbox Code Playgroud)
这是不正确的联想:
2**2**2**2 = 65536
2?2?2?2 = 256
2? (2? (2?2) ) = 65536
Run Code Online (Sandbox Code Playgroud)
我做得不对(咳咳)?
我不明白这种行为:
> sort([1,2,3,4]) ~~ sort([1,2,3,4])
False
Run Code Online (Sandbox Code Playgroud)
你能解释一下吗?根据Perl 6,为什么这两个列表(显然相等)不相等.
更新
有趣,但它取决于Perl6版本(我刚刚注意到它):
$ which perl6
/usr/bin/perl6
$ dpkg -S `which perl6`
rakudo: /usr/bin/perl6
$ perl6 --version
This is perl6 version 2015.11 built on MoarVM version 2015.11
$ perl6
> sort([1,2,3]) ~~ sort([1,2,3])
True
>
$ export PATH=~/.rakudobrew/bin:$PATH
$ perl6 --version
This is Rakudo version 2017.12 built on MoarVM version 2017.12.1
implementing Perl 6.c.
$ perl6
To exit type 'exit' or '^D'
> sort([1,2,3]) ~~ sort([1,2,3])
False
>
Run Code Online (Sandbox Code Playgroud)
从#perl6的讨论开始:
[19:35] <+committable6> AlexDaniel,
¦2015.12,2016.01.1,2016.02,2016.03,2016.04,2016.05,2016.06,2016.07.1,2016.08.1,2016.09,2016.10,2016.11,2016.12: …Run Code Online (Sandbox Code Playgroud) 我最近尝试my Array @a = 'a'..'z';和my Array @a = @('a'..'z');。
两者都会产生以下错误:
Type check failed in assignment to @a; expected Array but got Str ("a")
in block <unit> at <unknown file> line 1
Run Code Online (Sandbox Code Playgroud)
但是,在没有类型的情况下进行初始化会起作用,并且似乎最终会产生一个Array:
> my @a = 'a'..'z';
> @a.^name
Array
Run Code Online (Sandbox Code Playgroud)
为什么会这样呢?
在Perl 5和Perl 6之间差异的总结中,注意到该wantarray功能已经消失:
wantarray()走了
wantarray走了.在Perl 6中,上下文向外流动,这意味着例程不知道它在哪个上下文中.
相反,你应该返回在每个上下文中做正确事情的对象.
有人可以举例说明如何创建这样的对象吗?
在Perl文档中,有一个关于.postfix/.postcircumfix的部分,它说
在大多数情况下,可以在后缀或后缀之前放置一个点:
my @a;
@a[1, 2, 3];
@a.[1, 2, 3]; # Same
Run Code Online (Sandbox Code Playgroud)
从技术上讲,不是真正的运营商; 它的语法特殊于编译器.
我试过自己:
> my @a = 1,2,3,4,5
> @a[1] # 2
> @a.[1] # 2
> my %a = Perl => 6, Python => 3, PHP => 7
> %a<Perl> #6
> %a.<Perl> #6
> my @weekdays = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
> @weekdays.antipairs.hash{'Sunday'} # 6, I expected it to be syntax wrong, but it did work!
> @weekdays.antipairs.hash.{'Sunday'} # 6, seems …Run Code Online (Sandbox Code Playgroud) 我对双连接应该如何工作感到困惑.
这有点道理:
say all('a', 'b', 'c') ~ any('d', 'e');
Run Code Online (Sandbox Code Playgroud)
给
all(any(ad, ae), any(bd, be), any(cd, ce))
Run Code Online (Sandbox Code Playgroud)
这没有意义:
say any('a', 'b', 'c') ~ all('d', 'e');
Run Code Online (Sandbox Code Playgroud)
给
all(any(da, db, dc), any(ea, eb, ec))
Run Code Online (Sandbox Code Playgroud)
这让我感到困惑,因为我希望在字母'd'左边的字母'a'现在在右边.
我在试验在Perl 6 REPL上定义运算符时遇到了问题,并注意到它们确实有效,但只有在它们被定义的同一行上使用时才会有效.为什么会这样?
> sub postfix:<!>(Int $x where { $x >= 0 }) { [*] 1..$x }; 6!;
720
> 6!;
===SORRY!=== Error while compiling:
Negation metaoperator not followed by valid infix
------> 6!?;
expecting any of:
infix
infix stopper
Run Code Online (Sandbox Code Playgroud) operators user-defined-functions perl6 read-eval-print-loop raku
Perl 5有encodingpragma或Filter::Encoding模块,但是,我没有在Perl 6中发现任何类似的东西.我想最终会创建源过滤器,但是暂时,你能在Perl 6脚本中使用其他编码吗?
perl6如何确定proto token首先匹配哪个?
下面的代码按预期方式工作,它与string匹配1234,并Grammar::Tracer显示与之匹配的第一个标记是s:sym<d>,这是有意义的,因为它是最长的标记。
但是,如果我将文字更改为令牌,例如,将token threeform 更改'3'为<digit>,它将无法匹配,并Grammar::Tracer显示s:sym<b>与first匹配。
移动s:sym<d>到顶部,在两种情况下都匹配字符串,但是对该行为的解释是什么?
#!/usr/bin/env perl6
no precompilation;
use Grammar::Tracer;
grammar G {
token TOP { <s> }
proto token s { * }
token s:sym<a> { <one> }
token s:sym<b> { <one> <two> }
token s:sym<c> { <one> <two> <three> }
token s:sym<d> { <one> <two> <three> <four> }
token one { '1' }
token two …Run Code Online (Sandbox Code Playgroud)