标签: raku

我的班级和我们在 Raku(perl6) 中的班级有什么区别?

我已经阅读了规范,但我仍然很困惑my class[our] class. 有什么区别以及何时使用哪个?

raku

4
推荐指数
3
解决办法
152
查看次数

使用语法解析可能嵌套的支撑项

我开始编写BibTeX解析器.我想做的第一件事是解析一个支撑项目.例如,支撑项可以是作者字段或标题.字段中可能有嵌套的大括号.下面的代码并没有处理嵌套括号:

use v6;

my $str = q:to/END/;
  author={Belayneh, M. and Geiger, S. and Matth{\"{a}}i, S.K.}, 
  END

$str .= chomp;

grammar ExtractBraced {
    rule TOP {
        'author=' <braced-item> .*
    }
    rule braced-item      { '{' <-[}]>* '}' }
}

ExtractBraced.parse( $str ).say;
Run Code Online (Sandbox Code Playgroud)

输出:

?author={Belayneh, M. and Geiger, S. and Matth{\"{a}}i, S.K.},?
 braced-item => ?{Belayneh, M. and Geiger, S. and Matth{\"{a}?
Run Code Online (Sandbox Code Playgroud)

现在,为了使解析器接受嵌套大括号,我想保留当前解析的开括号数量的计数器,当遇到右大括号时,我们减少计数器.如果计数器达到零,我们假设我们已经解析了完整的项目.

为了遵循这个想法,我尝试拆分braced-item正则表达式,对每个char实现语法操作.(braced-item-char下面正则表达式的操作方法应该处理大括号计数器):

grammar ExtractBraced {
    rule TOP {
        'author=' <braced-item> .*
    }
    rule braced-item      { …
Run Code Online (Sandbox Code Playgroud)

grammar perl6 raku

4
推荐指数
1
解决办法
129
查看次数

将函数指针放入 Perl6 NativeCall CStruct

试图与一个 C 库接口,该库采用一个带有一堆指向它在不同点调用的函数的指针的结构。

像这样:

struct callbacks {
    int (*foo)(int);
    int (*bar)(int);
}

int set_callbacks(callbacks *cbs);
Run Code Online (Sandbox Code Playgroud)

我可以进行回调:

sub foo-callback(int32 --> int32) {...}
sub bar-callback(int32 --> int32) {...}
Run Code Online (Sandbox Code Playgroud)

如果这样做会很酷:

class Callbacks is repr<CStruct>
{
    has &.foo (int32 --> int32);
    has &.bar (int32 --> int32);
}
Run Code Online (Sandbox Code Playgroud)

但事实并非如此。我正在尝试做一些事情:

class Callbacks is repr<CStruct>
{
    has Pointer $.foo;
    has Pointer $.bar;
}
Run Code Online (Sandbox Code Playgroud)

并将它们设置为nativecast(Pointer, &foo-callback)或一些,但我似乎无法强迫它们在那里。

除了编写一个小 C 函数来获取所有 Perl 6 函数指针并将它们插入 C 中的结构之外,还有什么方法可以做到这一点?

nativecall raku

4
推荐指数
1
解决办法
169
查看次数

如何通过扩展它正在使用的类来扩展模块?

一些背景:我想扩展JSON::Tiny以允许更轻松的列表解析.这类似于Perl 5中的relaxed标志JSON::XS.具体来说,我希望可以选择在列表末尾添加逗号.例如,{ "a" : 1, "b" : 2, }.注意之后的逗号2,正常的JSON语法规范(或JSON::Tiny)不允许这样做.

通过检查源代码,它似乎可以像扩展其中一个模块JSON :: Tiny :: Grammar一样简单,它JSON::Tiny在内部使用,然后覆盖其两个规则:

grammar JSON::Relaxed::Grammar is JSON::Tiny::Grammar {
    rule pairlist   { <pair> * %% \,            } # override this rule
    rule arraylist  {  <value> * %% [ \, ]        } #overide this rule
}
Run Code Online (Sandbox Code Playgroud)

请注意,唯一的修改JSON::Tiny::Grammar是引入%%运算符而不是%操作符pairlistarraylist规则.

这样的扩展将允许代码重用.(复制所有代码的替代方案JSON::Tiny是最后的选择.)

问题:现在的问题是如何在 …

inheritance grammar perl6 raku

4
推荐指数
1
解决办法
98
查看次数

如何存储run或shell返回的值?

假设我有这个脚本:

# prog.p6
my $info = run "uname";
Run Code Online (Sandbox Code Playgroud)

当我跑步时prog.p6,我得到:

$ perl6 prog.p6
Linux
Run Code Online (Sandbox Code Playgroud)

有没有办法存储返回值的字符串版本并阻止它输出到终端?

已经存在类似的问题,但它没有提供具体的答案.

perl6 raku

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

正则表达式断言仅在先行和后备方式中起作用

在尝试提出一些解决此问题的示例时,我提出了以下代码段:

my regex key {^^ <![#-]> \d+ }
say "333" ~~ &key;                         # OUTPUT: «?333??»
say "#333" ~~ &key;

say '333$' ~~ m/ \d+ <?[$]>/;              # OUTPUT: «?333??»
say '333' ~~ m/ \d+ <?[$]>/;
say '$333' ~~ m/<?[$]> \d+ /;
Run Code Online (Sandbox Code Playgroud)

只有表示为return的语句?333?似乎<! >可以用作先行断言,而<? >只能用作零宽度后向断言。是这样吗 如果是这样,创建正向超前断言和负向向后断言的方式是什么?

regex perl6 regex-lookarounds raku

4
推荐指数
1
解决办法
80
查看次数

如何更改正在使用的perl 6版本或为逗号使用的模块安装新模块?

当我在逗号中启动新项目时,它会弹出我要使用的版本。除了允许我从rakudobrew列表中的每个版本中进行选择之外,还有一个选项,它不是我在命令行中选择的选项。当我运行脚本时,它找不到已安装的模块。那我怎么能

  • 更改用于当前项目的Perl 6的版本?要不然
  • 如何安装从Comma IDE中找不到的模块?

我当然可以摆脱逗号,更改全局Rakudo版本,安装模块,然后返回到我正在使用的任何版本,但是我想知道如何从逗号本身中做到这一点。

perl6 raku commaide

4
推荐指数
1
解决办法
56
查看次数

perl6如何在用户定义的字符类中插入变量?

我正在尝试做的是允许程序根据遇到的文本来定义字符类。但是,<[]>从字面上接受字符,并且以下产生错误:

my $all1Line = slurp "htmlFile";
my @a = ($all1Line ~~ m:g/ (\" || \') ~ $0 {} :my $marker = $0; http <-[ $marker ]>*? page <-[ $marker ]>*? /); # error: $marker is taken literally as $ m a r k e r
Run Code Online (Sandbox Code Playgroud)

我想匹配所有格式为“ https:// foo?page = 0?ssl = 1 ”或“ http ... page ...”的链接

非常感谢你!

variables perl6 user-defined character-class raku

4
推荐指数
1
解决办法
110
查看次数

无痕类属性

尽管实际上你可以详细列举任何类型的数据结构,以适应它变成一个标量,sigilless变量可能有一定的内在价值,因为它们实际上不成形,用作类的属性。但是,似乎没有办法这样做,has \.a也不起作用has .\a。A has $!a可能涵盖了我们使用无符号变量可以实现的大部分功能,但是是否存在将它们用作属性的实际方法?

syntax object raku

4
推荐指数
1
解决办法
82
查看次数

以不同顺序执行时测试失败

当我执行此程序时:

use Test;
use NativeCall;

constant LIB  = ('gsl', v23);

sub gsl_sf_airy_Ai(num64 $x, uint32 $mode --> num64) is native(LIB) is export { * }
sub Ai(Numeric $x, UInt $mode --> Num) is export { gsl_sf_airy_Ai($x.Num, $mode) }

ok Ai(0, 0) == 0.3550280538878172, 'Ai 1';
ok gsl_sf_airy_Ai(0e0, 0) == 0.3550280538878172, 'Ai 2';
Run Code Online (Sandbox Code Playgroud)

即使我以这种方式交换两个“确定”的测试,测试也可以正常工作:

ok gsl_sf_airy_Ai(0e0, 0) == 0.3550280538878172, 'Ai 2';
ok Ai(0, 0) == 0.3550280538878172, 'Ai 1';
Run Code Online (Sandbox Code Playgroud)

如果我将声明移至模块:

unit module mymodule;
use NativeCall;

constant LIB  = ('gsl', v23);

sub gsl_sf_airy_Ai(num64 $x, …
Run Code Online (Sandbox Code Playgroud)

testing raku

4
推荐指数
1
解决办法
41
查看次数