该^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中读取STDIN的输入?
我认为有很多方法可以做到这一点,但我对最惯用的Perl6解决方案很感兴趣.
我是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)
我只想构建一个抽象语法树.
我正在学习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的回复.
如果您创建一个类:
class Foo { }
Run Code Online (Sandbox Code Playgroud)
该类将继承其所有方法Any,然后Mu.
我想创建一个不从任何其他类继承的类:它应该包含一个FALLBACK方法,该方法应该捕获对该对象实例的所有方法调用.
我查看了MetaModel代码,但似乎没有一种简单的方法来实现这一目标.欢迎所有建议!
更新:我决定采用Jonathan Worthington所描述的拦截任何方法调用方式.这导致CPAN上有两个新的Perl 6模块:InterceptAllMethods和Object :: Trampoline.
我对数学如何使用未定义的值感到困惑。我的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)
也许乘以一个未定义的值与此有关...?
究竟如何运作?
我正在尝试为此代码高尔夫挑战编写一个Perl 6正则表达式,该挑战用规则拆分字符串:
例如:
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或返回错误的结果。有没有适当的方法可以提前使用捕获,或者这是一个错误?
我试图定义一个子程序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) 似乎 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) 我试图在每个非字母数字字符之前放置一个转义符号:
> 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)