解释器中的参数语法似乎存在一些不一致之处.我正在使用最新的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 …Run Code Online (Sandbox Code Playgroud) 当使用相同字母名称但使用不同符号的变量时,似乎存在一些不一致的行为:
> my $a="foo";
foo
> my @a=1,2
[1 2]
> say $a
foo # this is what I have expected
> my $b = 1,2,3
(1 2 3)
> my @b = (0, $b.Slip)
[0 1] # I expect to get [0 1 2 3]; (0, |$b) not work either
> say $b
1 # I expect $b to be unchanged, (1,2,3), but it is now 1;
> say @a
[1 2]
> say @b
[0 1]
>
Run Code Online (Sandbox Code Playgroud)
我不确定为什么 …
循环遍历列表(或数组)时,有没有办法知道循环中当前元素的索引?
当然,问题可以通过索引循环来解决:
my @aa = 8 .. 12;
say "$_\t@aa[$_]" for 0 ..^ @aa.elems;
Run Code Online (Sandbox Code Playgroud)
但也许类似下面的内容是可能的(我用.CURRENT_INDEX我正在寻找的方法标记)?
my @aa = 8 .. 12;
say $_.CURRENT_INDEX\t$_ for @aa;
Run Code Online (Sandbox Code Playgroud) 我想知道,Perl 6文档是否以某种格式提供给电子阅读器(epub/mobi/fb2).我试图从这个网页制作一个epub ,其中所有的文档都方便地组合成一个文件.不幸的是,可用的转换器忽略了精彩的4级结构,所以我得到了一个没有书签的庞大的epub,这是不可能导航的.
那么,有没有人知道在哪里可以找到,或者可以通过书签使自己成为带有书签的Perl 6文档中的epub/mobi ?
快速的谷歌搜索引导我到python docs的epub.:)
我正在尝试为一个简单的DSL编写一个解析器,它在表单中有十几个语句<statementName> <param1> <param2> ... ;,其中参数的数量各不相同.由于语句的结构非常相似(所有匹配的语句名称字符串后跟一系列由名称给出的标记),并且所得结果的结构非常相似(所有存储语句名称和参数的哈希值),我想知道如何指定想要的结果结构,而不必为每个语句操作重复自己.
动作类的伪代码,可以帮助我指定这样的结果结构:
class FooActions {
method *_stmt ($/) {
@result[0] = make string of statement name $/[0];
@result[1] = make hash of $/[1..] with the keys being the name of the rule
at index (i.e. '"var"' for `<var=identifier>` and `"type"` for `<type>`, etc.) and
values being the `.made` results for the rules at index (see below);
return @result;
}
method identifier ($/) { return ~$/ }
method number ($/) { return +$/ …Run Code Online (Sandbox Code Playgroud) 这个问题与其他关于使块可迭代的问题在同一个问题上,但似乎揭示了mixins的一个不同问题(或者对我的语法有不同的误解).什么Iterable是使数据结构有效迭代,也就是说,你可以通过在它之前创建循环for.
Iterable用作对象的API,可以使用for构造和相关的迭代构造(如超运算符)进行迭代.
所以让我们尝试将其付诸实践:
my &logger = -> $event {
state %store;
if ( $event ) {
%store{ DateTime.new( now ) } = $event;
} else {
%store;
}
}
role Forable does Iterable {
method iterator(&self:) {
self( Nil );
}
}
logger( "One" );
logger( "Two" );
&logger does Forable;
.say for &logger;
Run Code Online (Sandbox Code Playgroud)
这根本行不通; say应用于&logger一个简单的项目.但是,如果我们将最后一句改为:
.say for &logger.iterator;
Run Code Online (Sandbox Code Playgroud)
我猜这表明该角色实际上正在工作,并且混入.由于类型为&loggeris Block+{Forable},如果Iterable没有直接混合,它可能不起作用.事实上,does Iterable从 …
用"cro sub"创建了一个websocket服务器.
写了这个客户:
use v6;
use Cro::WebSocket::Client;
constant WS-PORT = '20000';
constant WS-ADDRESS = 'localhost';
constant WS-PATH = 'chat';
constant WS-URL = 'ws://' ~ WS-ADDRESS ~ ':' ~ WS-PORT ~ '/' ~ WS-PATH;
constant TIMEOUT-TO-CONNECT = 5; # seconds
my $timeout;
my $connection-attempt;
await Promise.anyof(
$connection-attempt = Cro::WebSocket::Client.connect(WS-URL),
$timeout = Promise.in(TIMEOUT-TO-CONNECT));
if $timeout.status == Kept
{
say "* could not connect to server in ', TIMEOUT-TO-CONNECT, ' seconds";
exit 1;
}
if $connection-attempt.status != Kept
{
say "* error ", …Run Code Online (Sandbox Code Playgroud) 这与关于访问POD的这个问题有关,但它远不止于此.您可以使用以下命令轻松访问Perl 6程序的抽象语法树:
perl6 --target=ast -e '"Þor is mighty!".say'
Run Code Online (Sandbox Code Playgroud)
这将打印整个Q抽象语法树.如何从你自己的程序中做到这一点还不太清楚,或者我还没有找到如何做到这一点.实际上,该CoreHackers::Q模块将其作为外部脚本运行.但是能够从你自己的程序中访问它,比如
use QAST; # It does not exist
my $this-qast = QAST::Load("some-external-file.p6") # Would want something like this
Run Code Online (Sandbox Code Playgroud)
会很好.我很确定它应该是可能的,在NQP级别并且可能以Rakudo依赖的方式.有人知道热吗?
在尝试提出一些解决此问题的示例时,我提出了以下代码段:
my regex key {^^ <![#-]> \d+ }
say "333" ~~ &key; # OUTPUT: «?333??»
say "#333" ~~ &key;
say '333$' ~~ m/ \d+ <?[$]>/; # OUTPUT: «?333??»
say '333' ~~ m/ \d+ <?[$]>/;
say '$333' ~~ m/<?[$]> \d+ /;
Run Code Online (Sandbox Code Playgroud)
只有表示为return的语句?333?似乎<! >可以用作先行断言,而<? >只能用作零宽度后向断言。是这样吗 如果是这样,创建正向超前断言和负向向后断言的方式是什么?
当我在逗号中启动新项目时,它会弹出我要使用的版本。除了允许我从rakudobrew列表中的每个版本中进行选择之外,还有一个选项,它不是我在命令行中选择的选项。当我运行脚本时,它找不到已安装的模块。那我怎么能
我当然可以摆脱逗号,更改全局Rakudo版本,安装模块,然后返回到我正在使用的任何版本,但是我想知道如何从逗号本身中做到这一点。