小编Pat*_*Pat的帖子

Perl 6'^ ='运算符不会产生结果,导致程序永远不会终止

使用^=运算符时,程序永远不会终止,也不会产生结果.难道我做错了什么?

为了检查我是否可以重现这个,我使用了这个可工作的,可验证的例子:

my $k = 1;
$k ^= 24;
say $k;
Run Code Online (Sandbox Code Playgroud)

除此之外,我甚至尝试过:$k = $k ^ 24;- 但这仍然会产生同样的问题.

perl6 raku

10
推荐指数
2
解决办法
126
查看次数

如何在Perl6中实现递归语法

我正在尝试使用Perl6语法实现Markdown解析器并且遇到了blockquotes.块引用段落不能嵌套括号来表示,因为它是专门格式化行的列表.但从语义上讲,它是一个嵌套的降价.

基本上,这一切都归结为以下定义:

    token mdBlockquote {
        <mdBQLine>+ {
            my $quoted = [~] $m<mdBQLine>.map: { $_<mdBQLineBody> };
        }
    }
Run Code Online (Sandbox Code Playgroud)

mdBQLine令牌的实际实现与此无关.唯一需要注意的是,mdBQLineBody密钥包含>已经剥离的实际引用行.毕竟,对于一个块:

> # quote1
> quote2
>
> quote3
quote3.1
Run Code Online (Sandbox Code Playgroud)

$quoted标将包含:

# quote1
quote2

quote3
quote3.1
Run Code Online (Sandbox Code Playgroud)

现在,重点是解析上述数据并将其注入Match对象$/.这就是我完全陷入困境的地方.最明显的解决方案:

    token mdBlockquote {
        <mdBQLine>+ {
            my $quoted = [~] $m<mdBQLine>.map: { $_<mdBQLineBody> };
            $<mdBQParsed> = self.parse( $quoted, actions => self.actions );
        }
    }
Run Code Online (Sandbox Code Playgroud)

一次失败有两个原因:第一,$/是一个只读对象; 第二,.parse有效地修改它使得无法向原始树中注入任何东西.

是否有任何解决方案,然后分析解析数据,提取和重新解析blockquotes,重复......?

perl6 raku

10
推荐指数
2
解决办法
248
查看次数

Perl 6中的"种族"何时值得?

race将iterable上的操作自动划分为线程.例如,

(Bool.roll xx 2000).race.sum
Run Code Online (Sandbox Code Playgroud)

会自动将2000长阵列的总和分成4个线程.但是,基准测试显示,这比race没有使用时要慢得多.即使您使阵列更大,也会发生这种情况.即使非自动编程版本随每个版本变得越来越快,也会发生这种情况.(自动线程也变得更快,但仍然是不使用它的两倍.)

所以问题是:值得使用的原子操作的最小大小是多少?添加到顺序操作的开销是固定的还是可以某种方式降低?

更新:实际上,性能hyper(类似于种族,但有保证的有序结果)似乎随着时间的推移而变得越来越差,至少对于小尺寸而言,它们仍然是默认批量大小的整数倍(64).同样的情况与race

concurrency perl6 raku

10
推荐指数
1
解决办法
215
查看次数

如何将.lines Seq赋值给变量并迭代它?

为变量分配迭代器显然Seq会改变行为.例如

use v6;

my $i = '/etc/lsb-release'.IO.lines;
say $i.WHAT;
say '/etc/lsb-release'.IO.lines.WHAT;
.say for $i;
.say for '/etc/lsb-release'.IO.lines;
Run Code Online (Sandbox Code Playgroud)

结果是:

(Seq)
(Seq)
(DISTRIB_ID=Ubuntu DISTRIB_RELEASE=18.04 DISTRIB_CODENAME=bionic DISTRIB_DESCRIPTION="Ubuntu 18.04.1 LTS")
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.1 LTS"
Run Code Online (Sandbox Code Playgroud)

所以一旦分配,我只得到序列的字符串表示.我知道我可以使用.say for $i.lines相同的输出,但我不明白分配和未分配的迭代器/ Seq之间的区别.

perl6 raku

10
推荐指数
2
解决办法
114
查看次数

Perl 6 List Slatenation without Slip?

在Perl中,,运算符可用于连接列表; 但是,Perl 6并未在此上下文中压缩列表,从而导致列表中包含两个列表.连接列表需要使用|滑动操作符.

my @a = <a b c>;
my @b = <d e f>;
my @ab = |@a, |@b;
Run Code Online (Sandbox Code Playgroud)

这个操作有什么简写吗?

concatenation perl6 raku

9
推荐指数
1
解决办法
462
查看次数

为什么Perl6在追加后不检查数组长度?

我已经定义了一个新类型Tuple如下:

subset Tuple of Array where { .elems == 2 && .[0] < .[1] };
my Tuple $t = [1, 2];
say $t;  # [1 2] So far, so good.
Run Code Online (Sandbox Code Playgroud)

我无法使用更短或更长的阵列或[2, 1]正如预期的那样初始化它.但是,我可以补充一下:

$t.append(3);
say $t;  # [1 2 3] Ouch!
Run Code Online (Sandbox Code Playgroud)

怎么可能?

types perl6 raku

9
推荐指数
2
解决办法
127
查看次数

Perl 6设置操作如何比较元素?

在呐喊下奔跑(2016.10)

考虑构造一个集合并测试成员资格的代码:

my $num_set = set( < 1 2 3 4 > );
say "set: ", $num_set.perl;
say "4 is in set: ", 4 ? $num_set;
say "IntStr 4 is in set: ", IntStr.new(4, "Four") ? $num_set;
say "IntStr(4,...) is 4: ", IntStr.new(4, "Four") == 4;
say "5 is in set: ", 5 ? $num_set;
Run Code Online (Sandbox Code Playgroud)

直接4不在集合中,但IntStr版本是:

set: set(IntStr.new(4, "4"),IntStr.new(1, "1"),IntStr.new(2, "2"),IntStr.new(3, "3"))
4 is in set: False
IntStr 4 is in set: True
IntStr(4,...) is 4: …
Run Code Online (Sandbox Code Playgroud)

set perl6 moarvm raku

9
推荐指数
2
解决办法
312
查看次数

perl6排序数组的最佳方法是什么?

我需要对一组数组进行排序; .sort方法似乎默认工作.但是根据内部数组的不同索引排序的好方法是什么?

要排序的数组是更大的数组:('mmddyy'格式的生日)

my @allRecords = [ [birthday1 firstName1 lastName1 [data1]
                   [birthday2 firstName2 lastName2 [data2] 
                   ...
                   [birthdayN firstNameN lastNameN [dataN] ];

@allRecords.sort by itself sorts by birthdays. 
Run Code Online (Sandbox Code Playgroud)

什么是通过firstName或lastName或内部数组内的数据排序的更好方法?

非常感谢你!

arrays sorting perl6 indices raku

9
推荐指数
1
解决办法
108
查看次数

在变量中指定Perl 6类

我有一些Perl 6测试,从一些基本测试开始,我把类名称在变量中测试,在整个测试中使用该变量:

my $package = 'Some::Class';
use-ok $package;

my $class = ::($package);   
can-ok $class, 'new';
Run Code Online (Sandbox Code Playgroud)

我没有注意到这一点,但它不再有效,因为类现在被词法加载:

没有这样的符号'Some :: Class'

这不是一个难题.在没有use-ok和我想要的范围内加载模块::($package):

use Some::Class;

...
Run Code Online (Sandbox Code Playgroud)

其他解决方案(EVAL或许是一个丑陋的折扣)有我试图避免的问题.

但是,我并不特别喜欢,因为该名称在文件中出现两次.我特别喜欢我从Perl 5继承的以前工作的习语.如果我想更改一个类名,它只会在文件中出现一次.我可以很容易地生成样板测试(尽管,修复并不是那么难).

有没有办法可以回到我想要的理想状态?(虽然我认为下一个版本中的词法加载会再次妨碍).

class perl6 raku

9
推荐指数
1
解决办法
264
查看次数

结构数组作为Perl 6 NativeCall结构的属性

我正在尝试封装一个C结构,其中一个成员是一个指向结构的指针数组,而我在弄清楚如何执行它时遇到了问题.

假设C代码如下所示:

struct foo
{
  unsigned char a;
};

struct bar
{
  struct foo *f[5];
};
Run Code Online (Sandbox Code Playgroud)

这种代码有效:

use NativeCall;

class foo is repr('CStruct') {
  has uint8 $.a;
}

class bar is repr('CStruct') {
  has foo $.f1;
  has foo $.f2;
  has foo $.f3;
  has foo $.f4;
  has foo $.f5;
}
Run Code Online (Sandbox Code Playgroud)

但它太可怕了.

A CArray在这里没用,因为它只是一个指向数组的指针,而不是一个指针数组; 我不能使用类似的东西has A @.a,因为a repr('CStruct')不处理那种属性.

任何提示?

arrays perl6 nativecall raku

9
推荐指数
1
解决办法
167
查看次数

标签 统计

perl6 ×10

raku ×10

arrays ×2

class ×1

concatenation ×1

concurrency ×1

indices ×1

moarvm ×1

nativecall ×1

set ×1

sorting ×1

types ×1