小编Jus*_*Guy的帖子

Raku 中的方法/子绑定

我想知道是否有办法将方法和/或子绑定到 Raku 中的另一个方法/子名称。我已经看到如何将变量绑定到方法/子,但这并不是我想要的。我知道如何在 Perl 5 中做到这一点:

sub sub1 {
  print "sub1!\n";
}

*sub2 = \&sub1;

sub1(); # sub1!
sub2(); # sub1!
Run Code Online (Sandbox Code Playgroud)

methods binding alias function raku

20
推荐指数
2
解决办法
324
查看次数

Raku 中的否定命名正则表达式或字符类插值

我正在尝试解析带引号的字符串。像这样的东西:

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。有没有办法做这种事情?谢谢!

更新 1

我无法让@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)

regex raku

16
推荐指数
1
解决办法
132
查看次数

你如何在 Raku 中进行文件锁定?

我一直试图弄清楚如何在 Raku 中进行文件锁定但没有成功。我开始使用 NativeCall 研究 fcntl,但后来意识到 fcntl 锁不会阻止其他线程访问文件。在 Raku 中进行文件锁定的最佳方法是什么?

locking file raku

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

无法在另一个命名空间中插入变量 (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)

我错过了什么吗?谢谢!

namespaces string-interpolation raku

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

解决圆形模块加载的最佳方法

我试图让两个不同的对象相互引用,并在属性上使用类型检查。当我这样做时,我得到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)

YakStore.rakumod

unit class YakStore;

use Yak;

has Yak $.yak is rw;
Run Code Online (Sandbox Code Playgroud)

yak.rakutest

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)

是的,我知道,测试很蹩脚,但我只是想说明问题。谢谢!

circular-dependency raku

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

关于 Raku 中 EVAL 中哈希绑定的问题

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

hash binding eval class raku

8
推荐指数
1
解决办法
72
查看次数

属性值在 Proxy.new (Raku) 中变成“方法”

我试图理解为什么属性值是 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)

methods proxy attributes raku

6
推荐指数
1
解决办法
60
查看次数

在运行时在 Stash 中创建的符号在 Raku 的 PseudoStash 中不可用

这个问题始于我试图弄清楚为什么在运行时创建的符号对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)

scope eval scoping raku

6
推荐指数
1
解决办法
88
查看次数

用 qq 括号分隔符不要在 Raku 中插入代码

对不起,如果这在某处记录,但我一直无法找到它。将大括号定界符与 一起使用时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 指出的那样,我忘了提出实际问题:这是它应该工作的方式吗?

quoting string-interpolation raku

6
推荐指数
1
解决办法
90
查看次数