标签: raku

“compose_attributes”显然是在属性组合之前调用的

这是做这件事的另一种尝试,本质上是创建一个冻结的类:

my class MetamodelX::Frozen is Metamodel::ClassHOW {

    method compose_attributes(Mu \type) {
        for self.attributes(type, :local ) -> $a {
            my $attr = Attribute.new( :0rw, :0has_accessor, :name( $a.name ),
             :type($a.type), :package($a.package));
            self.add_attribute(type, $attr );
        }
        callsame();
    }
}

my package EXPORTHOW {
    package DECLARE {
        constant frozen = MetamodelX::Frozen;
    }
}
Run Code Online (Sandbox Code Playgroud)

类似于@jnthwrthngtn在这里的答案,其中方法是以特定形状创建的,以防止类如何以通常的方式创建它们,我在这里所做的是以只读方式重新创建属性,并且没有访问器,使用其余强制属性相同。然而,当您尝试实例化它时,这会失败:

Package 'Foo' already has an attribute named '$!bar'
Run Code Online (Sandbox Code Playgroud)

在任何罕见的情况下,这只会消除访问器,因为该属性已经是只读的,并且无法创建真正的冻结类(此外,它仍然可以被增强,因此不会被长期冻结)。您还能想到其他方法来实现同样的目标吗?

rakudo metamodel raku

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

如何展平或字符串化对象(尤其是匹配)?

我们如何将 Match(或其他)对象展平或字符串化为字符串数据类型(尤其是大量,即作为数组元素)?例如

'foobar' ~~ m{ (foo) };
say $0.WHAT;

my $foo = $0;
say $foo.WHAT
Run Code Online (Sandbox Code Playgroud)
(Match)
(Match)
Run Code Online (Sandbox Code Playgroud)

结局如何(Str)

raku

6
推荐指数
3
解决办法
163
查看次数

为什么在使用粗箭头语法构建的哈希变量之前添加类型会导致类型检查失败错误?

Raku 是渐进式打字语言。所以下面的代码:

my %hash = abc => 4.5, abd => 5.5, bcd => 6.4, bce => 3.6;
Run Code Online (Sandbox Code Playgroud)

是相同的:

my Hash %hash = abc => 4.5, abd => 5.5, bcd => 6.4, bce => 3.6;
Run Code Online (Sandbox Code Playgroud)

但是,它报告一个错误:

Type check failed in assignment to %hash; expected Hash but got Rat (4.5)
Run Code Online (Sandbox Code Playgroud)

为什么在使用粗箭头语法构建的哈希变量之前添加类型会导致类型检查失败错误?

hash raku

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

如何调试await multi Promise时会被系统杀死的脚本?

回答 “脚本使用了太多内存”

\n
\n

我开始逐行start读取文本文件,并将文本转换为 blob,然后将其发送到套接字:

\n
    use experimental :pack;\n\n    sub heart-msg(Str $msg, Str $device-id --> Blob) {\n        my $heart-msg = $msg.substr(0, $msg.chars - 8);\n        my $header-buf = pack("H*", $heart-msg);\n        my $device-id-buf = pack("L*", $device-id);\n\n        $header-buf ~ $device-id-buf\n    }\n\n    sub deal-message(Str $msg, Str $device-id --> Blob) {\n        my $now    = DateTime.now();\n        my $year   = $now.year;\n        my $month  = $now.month;\n        my $day    = $now.day;\n        my $hour   = $now.hour;\n        my $minute = $now.minute;\n        my $second = $now.second.Int;\n        my $check-number …
Run Code Online (Sandbox Code Playgroud)

sockets promise async-await raku

6
推荐指数
0
解决办法
96
查看次数

DBIish Oracle 驱动程序到底支持多线程吗?

的文档DBIish指出:

自 2021 年初以来,我成功实施了 Raku 解决方案,使用多达八 (8) 个线程,所有线程均连接到 Oracle,同时执行读取和写入。与 Perl-5 一样,首要要求是确保每个线程创建自己的与 Oracle 的连接句柄。

遵循此规则,我实现了一些基本的池化,其中线程请求连接句柄并在可用时获取它。池中充满连接句柄,直至达到某个预设限制。

还有最常用的准备好的语句句柄的每个连接缓存。

池大小为 1 时效果很好。即,基本上没有多线程。但是,一旦大小设置为 2,我就会terminated by signal SIGKILL (Forced quit)在对数据库进行 20-30 次写入后收到消息。

让我感到困惑的是,接收SIGSEGV或类似的事情会更令人期待。但SIGKILL?好像有什么东西从外部杀死了我的进程?

UPD这一切都是在 Linux 上进行的。Linux Mint,为了清楚起见。

raku

6
推荐指数
0
解决办法
89
查看次数

逗号报告测试函数的“子例程 X 未声明”

我是第一次使用 Comma IDE 功能。

我有一个非常简单的测试文件。逗号显示模块提供的子例程的警告Test以及报告Subroutine X is not declared

测试顺利通过。但我想知道我是否配置错误或者这是否可能是一个错误。

我使用的是 2022.01 版本(社区版),Build #CT-213.5744。(2022 年 1 月 30 日)运行时版本:11.0.13+7-b1751.19 x86_64 和 JetBrains sro 的 Dynamic Code Evolution 64 位服务器 VM 的 VM 如果重要的话,我的计算机上安装的 Java 版本是 1.8.0_321- b07,版本 8,更新 321。

在此输入图像描述

在此输入图像描述

raku commaide

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

Raku 语法操作抛出“无法绑定 Nil 类型对象中的属性。您是否忘记了‘.new’?” 使用“make”时出错

我在一个抛出异常的类中有这个方法Cannot bind attributes in a Nil type object. Did you forget a '.new'?

method parse() {
    grammar FindHeaders {
        token TOP { [<not-header> | <header>]+ $ }
        token not-header { ^^ <![#]> \N* \n }
        token header { ^^ '#'{ 1 .. 6 } <content> \n }
        token content { \N+ }
    }
    class HeaderActions {
        method content($match) {
            return if $match ~~ m/^^\#\s+<[A..Z]>+e*s/ || $match !~~ m/<[a..z]>/;
            return if $match ~~ m/\|/ && ( $match ~~ m:i/project/ || …
Run Code Online (Sandbox Code Playgroud)

grammar action raku

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

Raku 中的 srand 是预期的吗?

我正在尝试运行包含函数的代码srand

\n
srand(1);\nmy @x = (1..1000).roll(100);\nmy @y = (200..7000).roll(100);\nsay sum(@x);\nsay sum(@y);\nsay $*KERNEL\n
Run Code Online (Sandbox Code Playgroud)\n

从文档中可以清楚地看出,这srand依赖于平台的的。\n当我在 Windows 10 中测试这一点时,我得到了

\n
46221\n375477\nwin32\n
Run Code Online (Sandbox Code Playgroud)\n

当我在 glot.io 中测试它,我得到

\n
50941\n405340\nlinux\n
Run Code Online (Sandbox Code Playgroud)\n

在tio.run这里,我得到

\n
47784\n354115\nlinux (5.2.11.100.fc.29.x.86._.64)\n
Run Code Online (Sandbox Code Playgroud)\n

在 repl.it 中,我得到\n在此输入图像描述

\n
51496\n362664\nlinux\n
Run Code Online (Sandbox Code Playgroud)\n

在 raku irc 频道中,其

\n

在此输入图像描述

\n
50941\n405340\nlinux\n
Run Code Online (Sandbox Code Playgroud)\n

所以即使平台是linuxie $*KERNEL ~~ \'linux\',也有无数的输出。这是预期的吗?

\n

为什么我在这里问这个问题是因为我无法在持续集成(例如github操作)中测试以下代码,因为即使在linux. 以下代码在 GitHub Actions 中失败:

\n
use Test;\nif $*KERNEL ~~ \'win32\' {\n    srand(1); …
Run Code Online (Sandbox Code Playgroud)

rakudo raku github-actions

6
推荐指数
2
解决办法
170
查看次数

超级算子的奇怪行为

我发现了超级操作员的这种奇怪行为:

\n
say 0 != 0;                 # False\n\nmy @a = 0, 0, 0;\nsay @a \xc2\xab==\xc2\xbb @a;             # [True True True]\nsay @a \xc2\xab!=\xc2\xbb @a;             # [True True True] <--- why?\nsay @a \xc2\xab!==\xc2\xbb @a;            # [False False False]\n
Run Code Online (Sandbox Code Playgroud)\n

中缀运算符在这里!=定义为等价于 !==,但显然它不是,至少在超级运算符中使用时是这样。

\n

该问题似乎与特定值(零)有关,因为使用不同的值会返回预期结果。\n此外,使用0 but True工作正常:

\n
@a = 0 but True, 0 but True, 0 but True;\nsay @a \xc2\xab!=\xc2\xbb @a;             # [False False False]\n
Run Code Online (Sandbox Code Playgroud)\n

我正在使用 Rakudo 2022.03。

\n

这是一个错误还是我无法理解的东西?

\n

raku

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

如何使用任何“CommonMark”模块将选项传递给 commonmark 库?

我需要帮助获得线索。我认为我编译 C 代码的微不足道的经验是理解如何使用一些 Raku 模块来使用 CommonMark C 库的接口将 markdown 转换为 HTML 的障碍。

问题:

我在 Mac 上cmark安装了自制程序库。我正在使用CommonMark模块。它有效,但如果我在 Markdown 中嵌入了 html,我会得到:

<!-- raw HTML omitted -->

在输出中。AFAICT,CommonMark 有一个打开或关闭此功能的选项:https://github.com/commonmark/cmark/blob/8a023286198a7e408398e282f293e3b0baebb644/src/html.c#L171

CommonMark 模块似乎不允许我将参数传递给 cmark 库。该模块似乎: https: //raku.land/github:JJ/ cmark::Simple

但是,我无法真正了解文档,因为我不明白如何与 cmark 库交互。我什至不确定这个模块是否可以在 Mac 上运行。该模块似乎假定它应该安装在 debian 上。

有人可以告诉我吗?

commonmark cmark raku

6
推荐指数
0
解决办法
115
查看次数