我想知道是否有办法将方法和/或子绑定到 Raku 中的另一个方法/子名称。我已经看到如何将变量绑定到方法/子,但这并不是我想要的。我知道如何在 Perl 5 中做到这一点:
sub sub1 {
print "sub1!\n";
}
*sub2 = \&sub1;
sub1(); # sub1!
sub2(); # sub1!
Run Code Online (Sandbox Code Playgroud) 我正在尝试解析带引号的字符串。像这样的东西:
say '"in quotes"' ~~ / '"' <-[ " ]> * '"'/;
Run Code Online (Sandbox Code Playgroud)
(来自https://docs.raku.org/language/regexes “枚举字符类和范围”)但是......我想要更多一种类型的引用。这样的东西组成了不起作用的语法:
token attribute_value { <quote> ($<-quote>) $<quote> };
token quote { <["']> };
Run Code Online (Sandbox Code Playgroud)
我发现这个讨论是另一种方法,但它似乎没有去任何地方:https : //github.com/Raku/problem-solving/issues/97。有没有办法做这种事情?谢谢!
我无法让@user0721090601 的“多令牌”解决方案起作用。我的第一次尝试产生了:
say '"in quotes"' ~~ / '"' <-[ " ]> * '"'/;
Run Code Online (Sandbox Code Playgroud)
在做了一些研究之后,我补充说proto token quoted_string {*}:
#!/usr/bin/env raku
use Grammar::Tracer;
grammar QuotedString {
proto token quoted_string {*}
multi token quoted_string:sym<'> { <sym> ~ <sym> <-[']> }
multi token quoted_string:sym<"> { <sym> ~ <sym> …Run Code Online (Sandbox Code Playgroud) 我一直试图弄清楚如何在 Raku 中进行文件锁定但没有成功。我开始使用 NativeCall 研究 fcntl,但后来意识到 fcntl 锁不会阻止其他线程访问文件。在 Raku 中进行文件锁定的最佳方法是什么?
我正在尝试使用插值在另一个命名空间中创建一个变量,但在咨询https://docs.raku.org/language/packages#index-entry-::()后无法使其工作。在测试不同的东西时,我发现了一些让我感到困惑的东西。这有效:
#!/usr/bin/env raku
$Foo::bar = 'foobar';
say $Foo::bar;
Run Code Online (Sandbox Code Playgroud)
#!/usr/bin/env raku
$Foo::bar = 'foobar';
say $Foo::bar;
Run Code Online (Sandbox Code Playgroud)
但这不是:
#!/usr/bin/env raku
my $bar = 'bar';
$Foo::($bar) = 'foobar';
say $Foo::bar;
Run Code Online (Sandbox Code Playgroud)
$ ./package-interpolate.raku
No such symbol '$bar'
in block <unit> at ./package-interpolate.raku line 4
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?谢谢!
我试图让两个不同的对象相互引用,并在属性上使用类型检查。当我这样做时,我得到Circular module loading detected trying to precompile. 谷歌搜索让我https://docs.raku.org/language/faq#Can_I_have_circular_dependencies_between_modules?其中指出:
请注意,Raku 没有“1 个文件 = 1 个类”的限制,单个编译单元(例如,文件)内的循环依赖可以通过存根实现。因此,另一种可能的解决方案是将类移动到同一个编译单元中。
如果可以避免的话,我宁愿不将两个类都放在同一个单元中。由于没有示例,我不确定如何使用存根来完成此操作。以下是我正在尝试做的一个小例子:
unit class Yak;
use YakStore;
has YakStore $.yak-store is rw;
Run Code Online (Sandbox Code Playgroud)
unit class YakStore;
use Yak;
has Yak $.yak is rw;
Run Code Online (Sandbox Code Playgroud)
use lib '.';
use Test;
use Yak;
use YakStore;
plan 2;
my $yak-store = YakStore.new;
my $yak = Yak.new(:$yak-store);
$yak-store.yak = $yak;
isa-ok $yak-store.yak, Yak;
isa-ok $yak.yak-store, YakStore;
Run Code Online (Sandbox Code Playgroud)
是的,我知道,测试很蹩脚,但我只是想说明问题。谢谢!
在 EVAL 中绑定散列时,我遇到了一些我不明白的事情。在 EVAL 之外绑定哈希按预期工作。EVAL 中的未绑定哈希按预期工作。但是在 EVAL 内绑定一个散列并不像我期望的那样工作。(我的期望可能是错误的。)这是代码:
这有效:
#!/usr/bin/env raku
class Hash::Test does Associative {
has %.hash;
multi method STORE(@pairs) {
for @pairs -> $pair {
self.STORE: $pair
}
}
multi method STORE(Pair $pair) {
%!hash{$pair.key} = $pair.value;
}
}
no strict;
%hash-test := Hash::Test.new;
%hash-test = foo => 'bar', baz => 'quux';
say %hash-test;
Run Code Online (Sandbox Code Playgroud)
输出:
#!/usr/bin/env raku
class Hash::Test does Associative {
has %.hash;
multi method STORE(@pairs) {
for @pairs -> $pair {
self.STORE: $pair
}
}
multi …Run Code Online (Sandbox Code Playgroud) 我试图理解为什么属性值是 Proxy.new 之外的 Str(或其他),但成为 Proxy.new 内部的 Method。我把我的代码归结为:
#!/usr/bin/env raku
class Foo does Associative {
has Str $.string;
multi method AT-KEY (::?CLASS:D: Str $key) is rw {
say "\nOutside of Proxy: { $!string.raku }";
say "Outside of Proxy: { $!string.^name }";
Proxy.new(
FETCH => method () {
say "FETCH: { $!string.raku }";
say "FETCH: { $!string.^name }";
},
STORE => method ($value) {
say "STORE: { $!string.raku }";
say "STORE: { $!string.^name }";
}
);
}
}
my $string = 'foobar'; …Run Code Online (Sandbox Code Playgroud) 这个问题始于我试图弄清楚为什么在运行时创建的符号对EVAL.
外-EVAL.raku
#!/usr/bin/env raku
use MONKEY-SEE-NO-EVAL;
package Foobar {
our $foo = 'foo';
our sub eval {
say OUTER::;
EVAL "say $bar";
}
}
Foobar::<$bar> = 'bar';
say $Foobar::bar;
Foobar::eval;
.say for Foobar::;
Run Code Online (Sandbox Code Playgroud)
$ ./outer-EVAL.raku
===SORRY!=== Error while compiling /development/raku/VTS-Template.raku/scratchpad/./outer-EVAL.raku
Variable '$bar' is not declared
at /development/raku/VTS-Template.raku/scratchpad/./outer-EVAL.raku:10
------> EVAL "say ?$bar";
Run Code Online (Sandbox Code Playgroud)
我认为这与以这种方式创建的符号在PseudoStashs 中不可用有关。但我可能是错的。
外乐
#!/usr/bin/env raku
package Foobar {
our $foo = 'foo';
our sub outer {
say OUTER::;
}
}
Foobar::<$bar> = 'bar'; …Run Code Online (Sandbox Code Playgroud) 对不起,如果这在某处记录,但我一直无法找到它。将大括号定界符与 一起使用时qq,不会插入代码:
qq.raku
#!/usr/bin/env raku
say qq{"Two plus two": { 2 + 2 }};
say qq["Two plus two": { 2 + 2 }];
Run Code Online (Sandbox Code Playgroud)
$ ./qq.raku
"Two plus two": { 2 + 2 }
"Two plus two": 4
Run Code Online (Sandbox Code Playgroud)
显然,这没什么大不了的,因为我可以使用一组不同的分隔符,但我遇到了它并想我会问。
正如@raiph 指出的那样,我忘了提出实际问题:这是它应该工作的方式吗?