我正在写一个看起来像这样的课程:
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)
只有我不知道要完成这项工作需要添加什么角色。是否可以创建这样的角色?如果不是,是否还有另一种方法可以创建类型以执行所需的操作?
在我正在编写的程序包中,我有一个配置模块,如下所示:
use v6.d;
use JSON::Fast;
use PSBot::Tools;
sub EXPORT(--> Hash) {
my Str $path = do if %*ENV<TESTING> {
$*REPO.Str.IO.child('META6.json').e
?? $*REPO.Str.IO.child('t/config.json').Str # For when testing using zef
!! $*REPO.Str.IO.parent.child('t/config.json').Str; # For when testing using prove
} elsif $*DISTRO.is-win {
"%*ENV<LOCALAPPDATA>\\PSBot\\config.json"
} else {
"$*HOME/.config/PSBot/config.json"
};
unless $path.IO.e {
note "PSBot config at $path does not exist!";
note "Copy psbot.json.example there and read the README for instructions on how to set up the config file.";
exit 1;
}
with from-json …Run Code Online (Sandbox Code Playgroud) Normally in Perl 6, only roles are allowed to be parametric. Here, we'll be attempting to make classes, a kind (referred to from here on out as a metaobject) that isn't normally allowed to be parametric, parametric.
If you try to make a class parametric the naive way, this happens:
bastille% perl6 -e 'class Foo[::T] {}'
===SORRY!=== Error while compiling -e
Unable to parse class definition
at -e:1
------> class Foo?[::T] {}
expecting any of:
generic role
Run Code Online (Sandbox Code Playgroud)
But if you …
对于我正在编写的库,我在HOW上有一个属性,该属性使用handles特征将由另一HOW所完成的各种角色的方法委派给该HOW的实例。我的第一次尝试是这样的(尽管为了使它更易于阅读,这只会处理Metamodel::Naming):
class ParentHOW does Metamodel::Naming {
method new_type(ParentHOW:_: Str:D :$name!, Str:D :$repr = 'P6opaque' --> Mu) {
my ::?CLASS:D $meta := self.new;
my Mu $type := Metamodel::Primitives.create_type: $meta, $repr;
$meta.set_name: $type, $name;
$type
}
}
class ChildHOW {
has Mu $!parent;
has Mu $!parent_meta handles <set_name shortname set_shortname>;
submethod BUILD(ChildHOW:D: Mu :$parent is raw) {
$!parent := $parent;
$!parent_meta := $parent.HOW;
}
method new_type(ChildHOW:_: Mu :$parent is raw) {
my ::?CLASS:D $meta := self.new: :$parent;
Metamodel::Primitives.create_type: …Run Code Online (Sandbox Code Playgroud) 我时不时地发现自己需要编写具有两个或三个分支的条件:至少,一个用于定义所有两个或多个变量时,一个用于定义任何或不定义任何变量时。有时最后一个分支需要是两个独立的分支。写这个的一些简短而甜蜜的方式是什么?
我希望能够在程序运行时为我正在进行的项目编写热点模块.我试过这个,但它不起作用:
qx[rm -r .precomp/*];
try require PSBot;
try PSBot.test;
Run Code Online (Sandbox Code Playgroud)
有可能吗?如果是这样,我该怎么办?
我正在编写一个用于在Perl 6中创建monad的库。由于仅使用常规参数角色就无法正确扩展monad(据我所知),因此我决定创建一个自定义元模型类,该类扩展Metamodel::ParametricRoleHOW并引入特殊语法来创建单子。问题是当我尝试写时monad MonadName[::T],会发生这种情况:
bastille% perl6 monad-test.p6
===SORRY!=== Error while compiling /home/morfent/Documents/p6-Monad/monad-test.p6
Unable to parse monad definition
at /home/morfent/Documents/p6-Monad/monad-test.p6:8
------> monad Identity?[::T] {
expecting any of:
generic role
Run Code Online (Sandbox Code Playgroud)
当我只写monad Identity { ... }时,尝试专门化类型时会抛出该错误。我该怎么写,使单子参数化?单子不具备准确扩展角色元模型,但我宁愿它是可以使用does与单子,而不是is。另外,即使我已经知道如何执行此操作,其他人也可能没有,因为我认为它没有记录在案,因此,如果您可以在回答中包括如何使任何类型的参数成为一般参数,那么这将是一个更好的参考。
这是我目前用于创建monad的代码:
use v6.d;
class Type::MonadHOW is Metamodel::ParametricRoleHOW {
has Int $!feature_flags;
my enum FeatureFlags (
Value => 0x1,
Bind => 0x2,
Then => 0x4,
Return => 0x8
);
method !set_value(\M, Attribute:D $attr) {
self.Metamodel::ParametricRoleHOW::add_attribute: M, $attr; …Run Code Online (Sandbox Code Playgroud) 对于我正在编写的聊天机器人,我想让它的解析器可定制,这样人们就不需要修改机器人本身来为他们想要的任何类型的聊天消息添加挂钩。解析器使用语法。目前,我用一个看起来像这样的类来处理这个问题:
class Rule {
has Regex:D $.matcher is required;
has &.parser is required;
method new(::?CLASS:_: Regex:D $matcher, &parser) {
self.bless: :$matcher, :&parser
}
method match(::?CLASS:D: Str:D $target --> Replier:_) {
$target ~~ $!matcher;
$/.defined ?? &!parser(self, $/) !! Nil
}
}
Run Code Online (Sandbox Code Playgroud)
然后将从解析器的动作类循环遍历这些数组。这允许人们为解析器添加他们自己的“规则”,这解决了我的问题,但这很笨拙,这是重新发明语法!我真正想要的是人们能够为我的解析器编写类似俚语之类的东西。虽然augment可以用于此目的,但在这种情况下它不会有用,因为用户可能希望在运行时更改他们增强解析器的方式,但augment在编译时进行处理。如何才能做到这一点?
对于我正在重构的聊天机器人,不需要锁定来管理其大部分状态,它通过 websocket 连接到的网站将可以从普通用户接收的消息节流到 0.6 秒,将语音用户接收到 0.3 秒的速率,而管理员没有节流阀。直到建立连接后的某个时间点才知道用户是否有声音或管理员是否有声音;在此之前,每个人都被视为普通用户。
目前,我通过将react用于侦听消息的块放在一个循环中来处理受限制的消息,该循环在连接被强制关闭后退出。当节流阀更新时,我调用done进入下一次迭代,它更新whenever用于发送消息的供应块以具有更新的节流阀。这是可怕的,活泼的代码!
我可以做些什么来 (a) 确保连接以 0.3 秒的节流开始,该节流可以在建立 websocket 连接后立即使用,(b) 可以调用在需要时更新此节流的方法,以及 (c ) 不保留与此油门相关的任何状态(可以通过其他方式推断)?
编辑:我之前忘了提到这一点,但是所有类型的用户都有不受限制的消息,而不仅仅是管理员。
我有一个包config.json用于它使用的一些设置.我在本地保留包,而不是从CPAN安装它.我的问题是当我进行更改时config.json,程序包无法识别自配置文件缓存到别处以来的更改,迫使我运行zef install --force-install或删除precomp.如何确保程序包始终识别配置文件的更新?
我正在编写一个用于创建具有自定义行为的枚举的模块。我现在要做的是将枚举添加到GLOBAL程序包中,但是除非您在一个模块中创建枚举并从另一个模块导入枚举,否则不会安装任何词法符号。使用BEGIN $*W.install_lexical_symbol(...)不是一种选择,因为枚举的值可以从例如网络连接中获取,并且将阻止编译,直到接收到这些值为止。在运行时是否可以在调用者的上下文中安装词汇符号?如果是这样,怎么办?
我希望能够在REPR CStruct/CPointer的类中使用双指针:
typedef struct CipherContext {
void *cipher;
const uint8_t *key;
size_t key_len;
const uint8_t *path;
size_t path_len;
size_t block_size;
void *handle;
int (*cipher_init)(void **, const uint8_t *, size_t);
int (*cipher_encode)(void *, const uint8_t *, uint8_t *, size_t);
int (*cipher_decode)(void *, const uint8_t *, uint8_t *, size_t);
void (*cipher_free)(void *);
const uint8_t *(*cipher_strerror)(int);
} CipherContext;
int cipher_context_init(CipherContext **, const uint8_t *, size_t, const uint8_t *, size_t, size_t);
int cipher_context_encode(CipherContext *, const uint8_t *, uint8_t *, size_t);
int cipher_context_decode(CipherContext *, const …Run Code Online (Sandbox Code Playgroud)