我正在为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个不同的签名要写
在实际上可以接受的极少数情况下,例如在单元测试中,您可能想要获取或设置private属性的值,或者在不可能的情况下调用这种类型的private方法。真的不可能吗?如果没有,您该怎么办?
可以通过以下几种方式调用函数:
say(1, 2, 3) # 123
say: 1, 2, 3 # (1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
后者似乎通过了Positional,但除此之外,我不知道他们有何不同.是否有任何重要的差异需要知道?你会使用哪种类型的情况?
在我所有的Raku软件包中,自述文件的顶部都有一行,其中包含该模块的Travis徽章,如下所示:
[](https://travis-ci.org/Kaiepi/p6-Failable)
Run Code Online (Sandbox Code Playgroud)
目前,我正在主模块中使用POD6生成自述文件,但是每次执行此操作时,我都会手动将链接复制到Travis徽章。有什么方法可以格式化POD6链接,所以我不必这样做吗?
我有一个简单的测试文件,如下所示:
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) 我正在编写一个Telnet库,其中一个命令需要在根据RFC854发送的TCP数据包上设置URGENT标志:
通过TCP发送操作发送同步,其中设置了紧急标志,DM作为最后(或唯一)数据八位字节.
我怎样才能做到这一点?
我正在写一个看起来像这样的课程:
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,其在类属性最终成为未定义无论出于何种原因.我该怎么做才能解决这个问题?
我有很多可能会失败的函数,但是在其签名中定义了一个返回类型。由于我喜欢尽可能地定义变量的类型,因此我想定义一个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)
只有我不知道要完成这项工作需要添加什么角色。是否可以创建这样的角色?如果不是,是否还有另一种方法可以创建类型以执行所需的操作?
这有效:
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)
为什么会抛出?有没有一种方法可以将延迟列表与摘要一起使用?
在 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)