小编Kai*_*epi的帖子

如何使用NativeCall处理varargs

我正在为Editline编写绑定,并且其中一个函数history执行了这部分库的大部分工作,但有几个可能的签名:

:(Pointer[Internal], Pointer[Event], int32 --> int32)
:(Pointer[Internal], Pointer[Event], int32, int32 --> int32)
:(Pointer[Internal], Pointer[Event], int32, Str --> int32)
# etc.
Run Code Online (Sandbox Code Playgroud)

第三个参数是一个标志,用于确定history应该使用给定的参数调用哪个函数,但由于这些符号未导出,因此我无法使用它们.我怎样才能找到使用该功能的方法?我不能使用多子或用于cglobal将其转换为a Pointer,然后使用正确的签名.

编辑:我知道is symbol,但我想知道是否有更好的方法可以解决这个问题,因为有9个不同的签名要写

c perl6 nativecall

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

您如何从私有方法或属性所属的类型之外访问它们?

在实际上可以接受的极少数情况下,例如在单元测试中,您可能想要获取或设置private属性的值,或者在不可能的情况下调用这种类型的private方法。真的不可能吗?如果没有,您该怎么办?

metaprogramming private rakudo perl6 raku

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

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

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

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
查看次数

Markdown图片链接可以使用POD6生成吗?

在我所有的Raku软件包中,自述文件的顶部都有一行,其中包含该模块的Travis徽章,如下所示:

[![Build Status](https://travis-ci.org/Kaiepi/p6-Failable.svg?branch=master)](https://travis-ci.org/Kaiepi/p6-Failable)
Run Code Online (Sandbox Code Playgroud)

目前,我正在主模块中使用POD6生成自述文件,但是每次执行此操作时,我都会手动将链接复制到Travis徽章。有什么方法可以格式化POD6链接,所以我不必这样做吗?

markdown perl6 raku pod6

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

使用fcntl从stdout创建新文件描述符在文件中失败

我有一个简单的测试文件,如下所示:

use v6.c;
use NativeCall;

sub fcntl(int32, int32 --> int32) is native { * }
sub close(int32 --> int32) is native { * }

my $fd := fcntl($*OUT.native-descriptor, 0);
say $fd;
close($fd);
Run Code Online (Sandbox Code Playgroud)

返回的文件描述符是-1,这不是我想要的.但是当我在REPL中运行相同的代码时,我得到了我正在寻找的东西:

> use NativeCall
Nil
> sub fcntl(int32, int32 --> int32) is native { * }
sub fcntl (int32 $, int32 $ --> int32) { #`(Sub+{Callable[int32]}+{NativeCall::Native[Sub+{Callable[int32]},Str]}|17126514527616) ... }
> sub close(int32 --> int32) is native { * }
sub close (int32 $ --> int32) { #`(Sub+{Callable[int32]}+{NativeCall::Native[Sub+{Callable[int32]},Str]}|17126514527904) ... } …
Run Code Online (Sandbox Code Playgroud)

c openbsd perl6 nativecall raku

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

使用IO :: Socket :: Async设置TCP标志

我正在编写一个Telnet库,其中一个命令需要在根据RFC854发送的TCP数据包上设置URGENT标志:

通过TCP发送操作发送同步,其中设置了紧急标志,DM作为最后(或唯一)数据八位字节.

我怎样才能做到这一点?

networking tcp telnet perl6 raku

9
推荐指数
0
解决办法
145
查看次数

类中的私有属性使得类型化的公共属性未定义

我正在写一个看起来像这样的课程:

class ListenSocket is Tap {
    has         $!VMIO;
    has Promise $.socket-host;
    has Promise $.socket-port;

    method new(&on-close, Mu :$VMIO, Promise :$socket-host, Promise :$socket-port) {
        self.bless: :&on-close, :$VMIO, :$socket-host, :$socket-port;
    }

    submethod BUILD(Mu :$!VMIO) { }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试构建类与定义的承诺$socket-host$socket-port,其在类属性最终成为未定义无论出于何种原因.我该怎么做才能解决这个问题?

perl6

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

在Perl 6中创建Maybe类型

我有很多可能会失败的函数,但是在其签名中定义了一个返回类型。由于我喜欢尽可能地定义变量的类型,因此我想定义一个Maybe子集用于此目的。我想到的是:

subset Maybe is export of Mu where Mu | Failure;
Run Code Online (Sandbox Code Playgroud)

这个的问题Failure是的子类Mu,因此当我真正想要的是能够Failure动态地匹配一种特定类型时,它将匹配所有内容。我的下一个想法是创建一个用作类型的参数化角色,因为我不想为也可以是的每个单个类型创建子集Failure。我想象它看起来像这样:

role Maybe[::T] {
    # ...
}

sub foo(--> Int) { rand < 0.5 ?? 1 !! fail 'oops' }

my Maybe[Int] $foo = foo;
Run Code Online (Sandbox Code Playgroud)

只有我不知道要完成这项工作需要添加什么角色。是否可以创建这样的角色?如果不是,是否还有另一种方法可以创建类型以执行所需的操作?

types perl6 raku

8
推荐指数
3
解决办法
283
查看次数

是否可以将Feed与延迟列表一起使用?

这有效:

bastille% perl6 -e 'my @squares = (1...*).map({ $_ ** 2 }); say @squares[0..^10].join: ", "'
1, 4, 9, 16, 25, 36, 49, 64, 81, 100
Run Code Online (Sandbox Code Playgroud)

但是,这不是:

bastille% perl6 -e 'my @squares <== map { $_ ** 2 } <== 1...*; say @squares[0..^10].join: ", "'
Cannot push a lazy list onto a Array
  in block <unit> at -e line 1
Run Code Online (Sandbox Code Playgroud)

为什么会抛出?有没有一种方法可以将延迟列表与摘要一起使用?

lazy-evaluation perl6 raku

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

枚举是如何扩充的?

在 Raku 中,HOW 必须通过一种方法公开原型列表,该archetypes方法用于确定类型实现哪些更广泛的类型特征,例如参数性或可组合性。我注意到Metamodel::EnumHOW(与枚举一起使用的 HOW)具有augmentable原型,它被赋予在启用 pragmaaugment时使用关键字组合后可以扩展的类型MONKEY-TYPING

我对为什么枚举可以增加的第一个猜测是允许添加枚举值,所以我尝试写这个:

use v6;
use MONKEY-TYPING;

enum Foo <foo bar baz>;
augment enum Foo <qux>;
say qux;
Run Code Online (Sandbox Code Playgroud)

但这会抛出:

bastille% raku test.raku
===SORRY!=== Error while compiling /home/morfent/test.raku
Redeclaration of symbol 'Foo'.
at /home/morfent/test.raku:5
------> augment enum Foo? <qux>;
Run Code Online (Sandbox Code Playgroud)

因此,它们可能不打算以这种方式增强。

我的下一个猜测是,它们旨在针对枚举值而不是枚举类型本身进行扩充。augment,有趣的是,当您告诉它您要扩充哪种类型时,并没有考虑到类型实际具有的内容,因此我尝试像增加类一样扩充枚举:

use v6;
use MONKEY-TYPING;

enum Foo <foo bar baz>;

augment class Foo {
    proto method is-foo(::?CLASS:D: --> Bool:D) {*}
    multi method is-foo(foo: …
Run Code Online (Sandbox Code Playgroud)

enums metaprogramming raku

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