我正在尝试GetConsoleScreenBufferInfo(HANDLE, PCONSOLE_SCREEN_BUFFER_INFO)使用Perl 6和(当然)NativeCall从Windows API 使用该函数。
我想我已经CONSOLE_SCREEN_BUFFER_INFO正确设置了功能需要的结构,但是当我尝试转储其内容时,代码在调用后崩溃。
这是证明问题的最短的方法(不是很完全,但是很接近):
use NativeCall;
constant \HANDLE := Pointer[void];
constant \SHORT := int16;
constant \USHORT := uint16;
constant \WORD := uint16;
constant \DWORD := uint32;
constant \BOOL := int32;
constant \STD_OUTPUT_HANDLE := -11;
constant \STD_INPUT_HANDLE := -10;
class COORD is repr('CStruct') {
has SHORT $.X;
has SHORT $.Y;
}
class SMALL_RECT is repr("CStruct") {
has SHORT $.Left;
has SHORT $.Top;
has SHORT $.Right;
has SHORT $.Bottom;
};
class CONSOLE_SCREEN_BUFFER_INFO is repr("CStruct") { …Run Code Online (Sandbox Code Playgroud) 作品:
#!/usr/bin/env python3
from uniseg.graphemecluster import grapheme_clusters
def albanian_digraph_dh(s, breakables):
for i, breakable in enumerate(breakables):
if s.endswith('d', 0, i) and s.startswith('h', i):
yield 0
else:
yield breakable
print(list(grapheme_clusters('dhelpëror', albanian_digraph_dh)))
#['dh', 'e', 'l', 'p', 'ë', 'r', 'o', 'r']
Run Code Online (Sandbox Code Playgroud)
需要改进/定制:
perl -C -Mutf8 -mUnicode::GCString -E'
say join " ", Unicode::GCString
->new("dhelpëror")->as_array
'
#d h e l p ë r o r
perl6 -e'"dhelpëror".comb.say'
#(d h e l p ë r o r)
Run Code Online (Sandbox Code Playgroud)
注意:编写自己的细分(几乎可以保证不会正确实现UAX#29)算是避免问题的方法。
是否有一种直接的方法来使用Promise.in(或其他子/方法/类)来获得不确定的时间?换句话说,承诺永远不会解决。
目前,我正在检查$time何时遵守诺言,以查看是否请求了不确定的时间(以负数或0值表示),并防止react块退出。
这不是一个糟糕的解决方案,但是有没有更多惯用的方式来实现这一目标?
my $time=0;
react {
whenever Promise.in($time) {
#check if time is 0
done if $time > 0;
}
whenever signal(SIGINT) {
done;
}
#whenever Supply...{
#}
}
Run Code Online (Sandbox Code Playgroud) 该问题已移至“代码审查”中的该职位。请在代码审查中回答问题。谢谢!
受此颜色渐变生成器的启发,这是perl6中的渐变生成器。我想知道代码是否可以简化或改进。它将十六进制颜色转换为base10,计算渐变颜色,然后将颜色转换为base16。
my $initial_color = '#FF0000';
my $final_color = '#00FF00';
my $gradient = 10;
my @initial = ($initial_color ~~ /\#(..)(..)(..)/).list.map: { .Str.parse-base(16) };
my @final = ($final_color ~~ /\#(..)(..)(..)/).list.map: { .Str.parse-base(16) };
my @range = @final Z- @initial;
my @increment = @range.map: { $_ / $gradient };
my @color;
@color.push: @initial;
for (1..$gradient) -> $i {
@color.push: @(@color[$i-1]) Z+ @increment;
}
for (0..$gradient) -> $i {
@color[$i] = '#' ~ ( @(@color[$i]).map: { .base(16,0).fmt('%02s') } ).join; …Run Code Online (Sandbox Code Playgroud) 我怎么知道使用时我是否真的需要返回l值FALLBACK?
我正在使用,return-rw但我只想return在可能的地方使用。我想跟踪我是否实际上已修改过%!attrs或仅在FALLBACK调用时读取了该值。
或者(替代方案B)我可以附加回调或类似的东西%!attrs来监视更改吗?
class Foo {
has %.attrs;
submethod BUILD { %!attrs{'bar'} = 'bar' }
# multi method FALLBACK(Str:D $name, *@rest) {
# say 'read-only';
# return %!attrs{$name} if %!attrs«$name»:exists;
# }
multi method FALLBACK(Str:D $name, *@rest) {
say 'read-write';
return-rw %!attrs{$name} if %!attrs«$name»:exists;
}
}
my $foo = Foo.new;
say $foo.bar;
$foo.bar = 'baz';
say $foo.bar;
Run Code Online (Sandbox Code Playgroud) 如何为哈希创建代理对象?我似乎找不到传递哈希键的方法:
#sub attr() is rw {
sub attr($name) is rw {
my %hash;
Proxy.new(
FETCH => method (Str $name) { %hash«$name» },
STORE => method (Str $name, $value) { %hash«$name» = $value }
);
}
my $attr := attr();
$attr.bar = 'baz';
say $attr.bar;
Run Code Online (Sandbox Code Playgroud) 我正在寻找一些有关如何在Raku / perl6中按第n个文件读取文本文件的建议。
在生物信息学研究中,有时我们需要以一种不太直接的方式来解析文本文件。例如Fastq文件,一次以4行为一组存储数据。甚至更多,这些Fastq文件成对出现。因此,如果我们需要解析此类文件,则可能需要执行以下操作:从第一个Fastq文件读取4行,从第二个Fastq文件读取4行,然后从第一个Fastq文件读取接下来的4行,然后读取第二个fastq文件中的下4行,......
关于解决此问题的最佳方法,我是否可以提出一些建议?Raku的“ IO.lines”方法似乎能够一次处理每一行。但不确定如何处理每第n行
一个示例fastq文件对:https : //github.com/wtwt5237/perl6-for-bioinformatics/tree/master/Come%20on%2C%20sister/fastq 我们之前对“ IO.lines”进行的尝试:https:// github.com/wtwt5237/perl6-for-bioinformatics/blob/master/Come%20on%2C%20sister/script/benchmark2.p6
我因此从字符串中捕获一个数字:
my $n1;
if $string1 ~~ /(<[0..4]>)$/ {
$n1 = $0;
} else {
put "$string1 failed regex.";
die;
}
Run Code Online (Sandbox Code Playgroud)
这是很多行,但是我可以在一行中复制和编辑字符串,因此:
my $string2 = $group2.subst(/<[0..4]>$/, '');
Run Code Online (Sandbox Code Playgroud)
我仍在学习raku / perl6,我浏览了https://docs.perl6.org/type/Str,看起来Raku不能做到这一点……但我不确定。
有没有一种方法可以像上面的第一个代码示例一样在一行中捕获子字符串?
我在脚本中反复执行此过程,这确实会缩短脚本
Raku 是渐进式打字语言。所以下面的代码:
my %hash = abc => 4.5, abd => 5.5, bcd => 6.4, bce => 3.6;
Run Code Online (Sandbox Code Playgroud)
是相同的:
my Hash %hash = abc => 4.5, abd => 5.5, bcd => 6.4, bce => 3.6;
Run Code Online (Sandbox Code Playgroud)
但是,它报告一个错误:
Type check failed in assignment to %hash; expected Hash but got Rat (4.5)
Run Code Online (Sandbox Code Playgroud)
为什么在使用粗箭头语法构建的哈希变量之前添加类型会导致类型检查失败错误?
我需要帮助获得线索。我认为我编译 C 代码的微不足道的经验是理解如何使用一些 Raku 模块来使用 CommonMark C 库的接口将 markdown 转换为 HTML 的障碍。
问题:
我在 Mac 上cmark安装了自制程序库。我正在使用CommonMark模块。它有效,但如果我在 Markdown 中嵌入了 html,我会得到:
<!-- raw HTML omitted -->
在输出中。AFAICT,CommonMark 有一个打开或关闭此功能的选项:https://github.com/commonmark/cmark/blob/8a023286198a7e408398e282f293e3b0baebb644/src/html.c#L171
CommonMark 模块似乎不允许我将参数传递给 cmark 库。该模块似乎: https: //raku.land/github:JJ/ cmark::Simple
但是,我无法真正了解文档,因为我不明白如何与 cmark 库交互。我什至不确定这个模块是否可以在 Mac 上运行。该模块似乎假定它应该安装在 debian 上。
有人可以告诉我吗?