标签: perl6

解释器中的Perl 6函数参数语法(REPL)

解释器中的参数语法似乎存在一些不一致之处.我正在使用最新的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)

arguments function perl6

4
推荐指数
1
解决办法
142
查看次数

perl 6变量同名不同的sigils不一致行为

当使用相同字母名称但使用不同符号的变量时,似乎存在一些不一致的行为:

> 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)

我不确定为什么 …

variables sigils perl6

4
推荐指数
1
解决办法
117
查看次数

Perl 6在循环遍历列表时显示索引

循环遍历列表(或数组)时,有没有办法知道循环中当前元素的索引?

当然,问题可以通过索引循环来解决:

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)

perl6 raku

4
推荐指数
2
解决办法
254
查看次数

Perl 6文档是否适用于电子阅读器?

我想知道,Perl 6文档是否以某种格式提供给电子阅读器(epub/mobi/fb2).我试图从这个网页制作一个epub ,其中所有的文档都方便地组合成一个文件.不幸的是,可用的转换器忽略了精彩的4级结构,所以我得到了一个没有书签的庞大的epub,这是不可能导航的.

那么,有没有人知道在哪里可以找到,或者可以通过书签使自己成为带有书签的Perl 6文档中的epub/mobi ?

快速的谷歌搜索引导我到python docs的epub.:)

perl6

4
推荐指数
1
解决办法
121
查看次数

为不同arity的规则指定常见的语法操作

我正在尝试为一个简单的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)

parsing perl6

4
推荐指数
1
解决办法
127
查看次数

什么时候调用迭代器方法?

这个问题与其他关于使块可迭代的问题在同一个问题,但似乎揭示了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从 …

mixins perl6

4
推荐指数
2
解决办法
145
查看次数

Cro :: WebSocket :: Client不起作用

用"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)

perl6 cro

4
推荐指数
1
解决办法
153
查看次数

从另一个程序获取Perl 6文件的QAST

这与关于访问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依赖的方式.有人知道热吗?

abstract-syntax-tree rakudo perl6 nqp

4
推荐指数
1
解决办法
111
查看次数

正则表达式断言仅在先行和后备方式中起作用

在尝试提出一些解决此问题的示例时,我提出了以下代码段:

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?似乎<! >可以用作先行断言,而<? >只能用作零宽度后向断言。是这样吗 如果是这样,创建正向超前断言和负向向后断言的方式是什么?

regex perl6 regex-lookarounds raku

4
推荐指数
1
解决办法
80
查看次数

如何更改正在使用的perl 6版本或为逗号使用的模块安装新模块?

当我在逗号中启动新项目时,它会弹出我要使用的版本。除了允许我从rakudobrew列表中的每个版本中进行选择之外,还有一个选项,它不是我在命令行中选择的选项。当我运行脚本时,它找不到已安装的模块。那我怎么能

  • 更改用于当前项目的Perl 6的版本?要不然
  • 如何安装从Comma IDE中找不到的模块?

我当然可以摆脱逗号,更改全局Rakudo版本,安装模块,然后返回到我正在使用的任何版本,但是我想知道如何从逗号本身中做到这一点。

perl6 raku commaide

4
推荐指数
1
解决办法
56
查看次数