小编Pat*_*Pat的帖子

我应该如何处理行()无法读取的Perl 6 $*ARGFILES?

我正在玩弄lines你从命令行中指定的文件中读取行:

for lines() { put $_ }
Run Code Online (Sandbox Code Playgroud)

如果它无法读取它抛出的X::AdHoc其中一个文件名(有一天它可能会有更好的异常类型,因此我们可以使用.path方法获取文件名).很好,所以赶上:

try {
CATCH { default { put .^name } }
for lines() { put $_ }
}
Run Code Online (Sandbox Code Playgroud)

所以这就抓住了X::AdHoc错误,但就是这样.该try块在那时完成.它不能.resume并尝试下一个文件:

try {
CATCH { default { put .^name; .resume } }  # Nope
for lines() { put $_ }
}
Run Code Online (Sandbox Code Playgroud)

回到Perl 5的土地,你得到一个关于坏文件名的警告,程序继续下一步.

如果有一些参数,我可以@*ARGS先过滤然后重建$*ARGFILES:

$*ARGFILES = IO::CatHandle.new:  
    @*ARGS.grep( { $^a.IO.e and $^a.IO.r } ) if +@*ARGS;

for lines() { …
Run Code Online (Sandbox Code Playgroud)

io perl6 raku

10
推荐指数
1
解决办法
182
查看次数

Perl 6的<| w>字边界何时不是<<字边界?

我有两个代码,我认为应该是等价的.第一个用于<|w>指定字边界,其中非字字符(或字符串的开头)应该在H之前.第二个例子使用了<<,它应该做同样的事情.

my $string = 'Hamadryas perlicus';
say $string ~~ /
    <?after <|w> Hamadryas \s+ >
    (\w+)
    /;

say $string ~~ /
    <?after << Hamadryas \s+ >
    (\w+)
    /;
Run Code Online (Sandbox Code Playgroud)

第一个匹配,但第二个不匹配:

?perlicus?
 0 => ?perlicus?
Nil
Run Code Online (Sandbox Code Playgroud)

这两个还有其他一些区别吗?

regex perl6 raku

10
推荐指数
1
解决办法
177
查看次数

有没有办法列出Perl 6中本机​​接口可用的功能和数据结构?

主要是为了创建合理的示例,我想知道哪些数据结构和rountes可用于Perl6的native界面,如

class a-class is repr('CStruct') { has int $.whatever; }
class another-class is repr('CPPStruct') { has int $.whateverelse; }
sub a_native_function( another-class $object ) is native {*};
Run Code Online (Sandbox Code Playgroud)

有没有办法列出它们?我想特别获取C++函数和数据结构的示例,这样我就不必创建和编译外部库来创建示例.

perl6 nativecall raku

10
推荐指数
0
解决办法
138
查看次数

本地localtime()段错误

在尝试公开localtimePerl 6中的功能时,我似乎做错了什么:

use NativeCall;
my class TimeStruct is repr<CStruct> {
    has int32 $!tm_sec;
    has int32 $!tm_min;
    has int32 $!tm_hour;
    has int32 $!tm_mday;
    has int32 $!tm_mon;
    has int32 $!tm_year;
    has int32 $!tm_wday;
    has int32 $!tm_yday;
    has int32 $!tm_isdst;
    has Str   $!tm_zone;
    has long  $!tm_gmtoff;
}

sub localtime(uint32 $epoch --> TimeStruct) is native {*}
dd localtime(time);  # segfault
Run Code Online (Sandbox Code Playgroud)

跑下perl6-lldb-m,我得到:

Process 82758 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x5ae5dda1)
    frame #0: 0x00007fffe852efb4 libsystem_c.dylib`_st_localsub …
Run Code Online (Sandbox Code Playgroud)

perl6 nativecall raku

10
推荐指数
1
解决办法
113
查看次数

这两个函数调用约定有什么区别?

可以通过以下几种方式调用函数:

say(1, 2, 3) # 123
say: 1, 2, 3 # (1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

后者似乎通过了Positional,但除此之外,我不知道他们有何不同.是否有任何重要的差异需要知道?你会使用哪种类型的情况?

syntax function perl6 raku

10
推荐指数
2
解决办法
259
查看次数

禁止无重复变量重新绑定是否有目的或好处?

在试图更好地理解无格变量以及它们与$sigiled变量的区别时,我发现,与$sigiled变量不同,sigilless变量在初始化后无法反弹:

my $a = 42;
my $b := $a;
$b := 42;       # No exception generated

my \c := $a;
c := 42;        # OUTPUT: «Cannot use bind operator with this left-hand side?»
Run Code Online (Sandbox Code Playgroud)

这是设计的吗?如果是这样,当$不禁止这些变量被禁止时,是否有目的或好处禁止无重复变量重新绑定?

perl6 raku

10
推荐指数
2
解决办法
218
查看次数

使用NativeCall在不同平台上处理C typedef

有没有一种方便的方法来处理C typedef,它可能在各种平台上有不同的价值?

例如

#if defined(_WIN32)
    #define foo_t int32_t
#elif defined(_WIN64)
    #define foo_t int64_t
#else
    #define foo_t long
#endif

void handle_foo(foo_t* in) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

目前我在Perl 6中处理这个问题

sub handle_foo32(int32 is rw) is native(Str) { * }
sub handle_foo64(int64 is rw) is native(Str) { * }
sub handle_foo00(long  is rw) is native(Str) { * }

sub handle-foo(Int $in) {
    if $*DISTRO.is-win {
        given $*KERNEL.bits {
            when 32 {
                handle_foo32(my int32 $ = $in);
            }
            when 64 {
                handle_foo64(my int64 $ = $in); …
Run Code Online (Sandbox Code Playgroud)

c perl6 nativecall raku

10
推荐指数
1
解决办法
135
查看次数

Perl 6类型推断

鉴于:

sub abc(Int $n) { say $n }
Run Code Online (Sandbox Code Playgroud)

如果我们传递一个类型的变量Str,abc我们会得到一个编译时错误:

my Str $s = "123";   abc $s;
Run Code Online (Sandbox Code Playgroud)

如果我们传递一个包含字符串的无类型变量,我们会收到运行时错误:

my $s = "123";   abc $s;
Run Code Online (Sandbox Code Playgroud)

C++支持auto允许类型推断的关键字.

是否可以auto在Perl 6中定义类似于:

auto $s = "123";
Run Code Online (Sandbox Code Playgroud)

会导致$s输入Str

即,我们可以做到以下几点:

auto $s = "123";   abc $s;
Run Code Online (Sandbox Code Playgroud)

并得到一个编译时错误.

type-inference perl6 raku

10
推荐指数
3
解决办法
286
查看次数

如何创建一个不从任何其他类继承的类?

如果您创建一个类:

class Foo { }
Run Code Online (Sandbox Code Playgroud)

该类将继承其所有方法Any,然后Mu.

我想创建一个不从任何其他类继承的类:它应该包含一个FALLBACK方法,该方法应该捕获对该对象实例的所有方法调用.

我查看了MetaModel代码,但似乎没有一种简单的方法来实现这一目标.欢迎所有建议!

更新:我决定采用Jonathan Worthington所描述的拦截任何方法调用方式.这导致CPAN上有两个新的Perl 6模块:InterceptAllMethodsObject :: Trampoline.

perl6 mop meta-object-protocol raku

10
推荐指数
2
解决办法
220
查看次数

是否有Perl 6等效的字节数组?

我们来看一个Java的例子byte[] data.在Perl的方法签名中,我可以做,method myMethod($data)但这是一种有用的动态类型.

但是,我希望操作一个字节数组 - 那么有没有一种首选的方法将数据类型转换为字节数组或远程类似的东西?

我环顾四周,看到这里的代码将源数据转换为字节数组:

my $arr =  Buf.new('mystring'.encode('utf-8')); 
say $arr;
Run Code Online (Sandbox Code Playgroud)

这只是我的方法的首选输入,它将Buf通过$data方法变量进行操作吗?

arrays perl6 raku

10
推荐指数
2
解决办法
307
查看次数

标签 统计

perl6 ×10

raku ×10

nativecall ×3

arrays ×1

c ×1

function ×1

io ×1

meta-object-protocol ×1

mop ×1

regex ×1

syntax ×1

type-inference ×1