小编Eli*_*sen的帖子

如何设置类的默认参数化?

^parameterize方法允许用一些给定的信息(例如角色)来参数化一个类.

my role A[::T = Mu] { }

my class B {
    method ^parameterize(Mu \base, Mu \type) {
        my \what := base.^mixin(A[type]);
        what.^set_name(base.^name ~ '[' ~ type.^name ~ ']');
        what
    }
}

dd B[Int];        # B[Int]
dd B[Int].^roles; # (A[Int],)
Run Code Online (Sandbox Code Playgroud)

但是,我还没有找到一种方法来制作非参数化版本的B参数化版本的角色A.

dd B;        # B
dd B.^roles; # (), want to see (A[Mu],)
Run Code Online (Sandbox Code Playgroud)

我试图添加一个^compose方法,但只有在参数化类时才会调用它.

建议非常欢迎!

perl6

11
推荐指数
1
解决办法
123
查看次数

我如何阅读Rakudo Perl6中的STDIN?

就这么简单,如何在Perl6中读取STDIN的输入?

我认为有很多方法可以做到这一点,但我对最惯用的Perl6解决方案很感兴趣.

io stdin rakudo perl6 raku

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

具有运算符优先级规则的Perl 6语法示例

我是Perl的新手,想要使用运算符创建一个特定于域的语言,这些运算符优先使用新的Perl 6语法功能.例如,以正确的方式解析"1 + 2*6".

我到目前为止找到的文档(例如这个)没有为具有优先级声明的运算符提供语法规则的示例.

我有这个非常简单的例子

use v6;

#use Grammar::Tracer;

grammar TestGrammar {

    token TOP {
        <digit> <infix> <digit>
    }

    token infix:sym<times> is equiv(&infix:<*>) { <sym> }

}

sub MAIN() {
    my $text = "1 times 2" ;
    say $text ;

    my $match = TestGrammar.parse($text);
    say $match;
}
Run Code Online (Sandbox Code Playgroud)

这给了我

No such method 'infix' for invocant of type 'TestGrammar'
Run Code Online (Sandbox Code Playgroud)

我只想构建一个抽象语法树.

grammar parsing perl6 raku

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

Perl 6中()和[]之间的区别

我正在学习Perl 6,并且无法理解下面的Perl 6单线程

我的Perl 6是 rakudo-star: stable 2014.04 (bottled)

这很好用.数组/列表已排序

[njia@mb-125:~] : perl6 -e 'say [2443,5,33, 90, -9, 2, 764].sort'
-9 2 5 33 90 764 2443
Run Code Online (Sandbox Code Playgroud)

但这不会排序数组/列表,如果[].sort工作原因@s.sort不是?

[njia@mb-125:~] : perl6 -e 'my @s = [2443,5,33, 90, -9, 2, 764]; @s.sort.say'
2443 5 33 90 -9 2 764
Run Code Online (Sandbox Code Playgroud)

从改变[]()

[njia@mb-125:~] : perl6 -e 'my @s = (2443,5,33,90,-9,2,764); @s.sort.say'
-9 2 5 33 90 764 2443
Run Code Online (Sandbox Code Playgroud)

注意此问题中描述的行为在perl6的发行版中已更改.请参阅G. Cito的回复.

arrays perl perl6 data-structures raku

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

如何创建一个不从任何其他类继承的类?

如果您创建一个类:

class Foo { }
Run Code Online (Sandbox Code Playgroud)

该类将继承其所有方法Any,然后Mu.

我想创建一个不从任何其他类继承的类:它应该包含一个FALLBACK方法,该方法应该捕获对该对象实例的所有方法调用.

我查看了MetaModel代码,但似乎没有一种简单的方法来实现这一目标.欢迎所有建议!

更新:我决定采用Jonathan Worthington所描述的拦截任何方法调用方式.这导致CPAN上有两个新的Perl 6模块:InterceptAllMethodsObject :: Trampoline.

perl6 mop meta-object-protocol raku

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

具有未定义的Perl6值的数学

我对数学如何使用未定义的值感到困惑。我的Perl 5直觉告诉我,这些值在大多数情况下等于零,例如:

> my $x
(Any)
> $x += 5
5
Run Code Online (Sandbox Code Playgroud)

如预期的那样。

> my $x
(Any)
> $x *= 3
3
Run Code Online (Sandbox Code Playgroud)

等一下 现在好像未定义的值被解释为1

我知道Perl6对于某些运算符具有一些identity元素的概念:

> [*] ()
1
Run Code Online (Sandbox Code Playgroud)

也许乘以一个未定义的值与此有关...?

究竟如何运作?

perl6 raku

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

Perl 6:提前捕获

我正在尝试为此代码高尔夫挑战编写一个Perl 6正则表达式,该挑战用规则拆分字符串:

  • 长度小于等于3的相同字符的序列将被分组在一起
  • 但是4个或更多将导致在检查其余两个之前将前两个分组

例如:

66667888    -> '66', '66, '7', '888'
19999999179 -> '1', '99', '99', '999', '1', '7', '9'
Run Code Online (Sandbox Code Playgroud)

我以为正则表达式m:g/(.)[$0$0<!$0>|$0?]/可以正常工作,但是在负前瞻中使用捕获似乎会破坏它,而且我不知道如何正确使用它。

根据我的使用方式,它会永远循环,抛出错误 Cannot resolve caller INTERPOLATE_ASSERTION返回错误的结果。有没有适当的方法可以提前使用捕获,或者这是一个错误?

regex perl6 regex-lookarounds raku

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

如何对 Raku 函数的数组参数的条目进行类型约束?

我试图定义一个子程序Raku,其理由是,比方说,一个阵列诠释S(强加的约束,即拒绝那些参数不是 ArrayS的IntS)。

问题:实现这一目标的“最佳”方式是什么(最惯用的,或最直接的,或者您认为“最佳”在这里应该是什么意思)?

RakuREPL 中运行的示例如下。

我所希望的会奏效

> sub f(Int @a) {1}
&f
> f([1,2,3])
Type check failed in binding to parameter '@a'; expected Positional[Int] but got Array ([1, 2, 3])
  in sub f at <unknown file> line 1
  in block <unit> at <unknown file> line 1
Run Code Online (Sandbox Code Playgroud)

另一个非工作示例

> sub f(@a where *.all ~~ Int) {1}
&f
> f([1,2,3])
Constraint type check failed in binding to parameter '@a'; …
Run Code Online (Sandbox Code Playgroud)

types constraints raku

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

为什么子程序在 raku 中的“返回”映射中使用时无法访问动态变量?

似乎 aasub在映射内部使用时无法访问动态变量并且该映射被“返回”。

考虑这段代码:

sub start {
    my $*something = 'foobar';
    
    # WORKS
    say 'first say-something:';
    say-something;
    
    # WORKS
    say 'mapped say-something, no return:';
    my @foo = (^2).map({say-something});
    
    # ERROR: Dynamic variable $*something not found
    say 'mapped say-something, with return:';
    return (^2).map({say-something});
}

sub say-something {
    say $*something;
    1
}

start;
Run Code Online (Sandbox Code Playgroud)

这将输出:

first say-something:
foobar
mapped say-something, no return:
foobar
foobar
mapped say-something, with return:

Dynamic variable $*something not found
  in sub say-something at main.raku line 18
  in block …
Run Code Online (Sandbox Code Playgroud)

subroutine rakudo dynamic-variables raku

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

在每个非字母数字字符之前放置转义符号

我试图在每个非字母数字字符之前放置一个转义符号:

 > my $b = "!@#%^||" ~ "/welcome xyz:!@#\$%^&*()|:;.,?/-."
!@#%^||/welcome xyz:!@#$%^&*()|:;.,?/-.

> my $c = $b.subst(/<:!L + :!N - [./-]>/, "\\" ~ $/, :g)
\ \ \ \ \ \ \ /welcome\ xyz\ \ \ \ \ \ \ \ \ \ \ \ \ \ .\ \ /-.
Run Code Online (Sandbox Code Playgroud)

这是第一次运行代码后的结果。第二次运行代码后,结果是一长串重复匹配。如果我使用“?”,会得到类似的结果 量词。

> my $c = $b.subst(/<:!L + :!N - [./-]>/, "\\" ~ $/, :g)
\! @ # % ^ | |   : ! @ # $ % ^ & * …
Run Code Online (Sandbox Code Playgroud)

escaping non-alphanumeric char raku

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