我发现,在用引号插入时,Unicode和ASCII运算符有时会工作不同。
考虑一下:
$ perl6 -e'my $a = BagHash.new: <a a a a b b b c c c c c d>;for $a.keys -> $k { say "$k => $a<<$k>>" }'
d => 1
b => 3
c => 5
a => 4
Run Code Online (Sandbox Code Playgroud)
和这个:
$ perl6 -e'my $a = BagHash.new: <a a a a b b b c c c c c d>;for $a.keys -> $k { say "$k => $a«$k»" }'
c => c(5) a(4) b(3) d«c»
a => c(5) …Run Code Online (Sandbox Code Playgroud) 我正在尝试封装一个C结构,其中一个成员是一个指向结构的指针数组,而我在弄清楚如何执行它时遇到了问题.
假设C代码如下所示:
struct foo
{
unsigned char a;
};
struct bar
{
struct foo *f[5];
};
Run Code Online (Sandbox Code Playgroud)
这种代码有效:
use NativeCall;
class foo is repr('CStruct') {
has uint8 $.a;
}
class bar is repr('CStruct') {
has foo $.f1;
has foo $.f2;
has foo $.f3;
has foo $.f4;
has foo $.f5;
}
Run Code Online (Sandbox Code Playgroud)
但它太可怕了.
A CArray在这里没用,因为它只是一个指向数组的指针,而不是一个指针数组; 我不能使用类似的东西has A @.a,因为a repr('CStruct')不处理那种属性.
任何提示?
平面多维数组的最短方法是什么?
以下是我的意思的一些例子:
# 2D array
my @a = [1,2],[3,4];
say @a».Slip.flat; # prints (1 2 3 4)
# 3D array
my @b = [[1,2],[3,4]],[[5,6],[7,8]];
say @b».Slip».flat».Slip.flat; # prints (1 2 3 4 5 6 7 8)
# but needs to know how many dimensions
# there are to flatten
Run Code Online (Sandbox Code Playgroud)
是否有可能以递归方式展平数组数组,例如@b不写入以递归方式下降到其中的子数据或者对其维数的数量有任何了解?
我问这个是因为我相信编译器(现在或将来的实现)能够优化基于操作员的解决方案而不是sub.
在Perl 6中,可以将波浪号运算符用于嵌套结构。棘轮运动显然会影响嵌套结构的工作方式。
这种情况不使用棘轮:
$ perl6 -e "say '{hello} aaa }' ~~ / '{' ~ '}' ( .+? ) /"
?{hello}?
0 => ?hello?
Run Code Online (Sandbox Code Playgroud)
虽然这样做:
$ perl6 -e"say '{hello} aaa }' ~~ / :r '{' ~ '}' ( .+? ) /"
Nil
Run Code Online (Sandbox Code Playgroud)
通过将.+?模式更改为更具体的内容,可以得到预期的结果<-[}]> +:
$ perl6 -e"say '{hello} aaa }' ~~ / :r '{' ~ '}' ( <-[}]> + ) /"
?{hello}?
0 => ?hello?
Run Code Online (Sandbox Code Playgroud)
但我不知道为什么“节俭量词”不能使用棘轮功能工作。任何的想法?
(使用rakudo 2019.03.1)
我有这个程序:
\nclass Foo {\n has $.first;\n}\n\nmy $a = Attribute.new(\n :name('$!second'),\n :type(Int),\n :package('Foo'),\n :has_accessor(True)\n );\nFoo.^add_attribute($a);\nFoo.^compose;\n\nFoo.^attributes\xc2\xbb.say; # Mu $!first\xe2\x90\xa4Int $!second\xe2\x90\xa4\n\nmy $foo = Foo.new: :42first, :21second;\n\n$foo.second.say; # P6opaque: no such attribute '$!second' on type Foo in a Foo when trying to get a value\nRun Code Online (Sandbox Code Playgroud)\n该attributes方法显示该属性已添加,创建对象显然成功,但是当我尝试访问该$!second属性时,我收到错误。
我缺少什么?
\n我写了这个测试程序:
await Promise.anyof(
Promise.allof((^5).map: {start { sleep 10; say "done $_" } }),
Promise.in(5).then: { say 'ouch' }
);
sleep 10;
Run Code Online (Sandbox Code Playgroud)
当第二个承诺超时时,它打印'ouch'并等待退出,但第一个promise的代码块仍在运行.五秒钟之后,它的五个过程结束并打印"完成":
$ ./test1.p6
ouch
done 0
done 1
done 2
done 3
done 4
Run Code Online (Sandbox Code Playgroud)
我试图终止第一个承诺,将其分配给变量,然后.break从第二个承诺调用该方法,但它不起作用.
有没有办法杀死第一个承诺和其他五个承诺呢?
我正在使用NativeCall接口; 有一个接受回调的C函数,定义如下:
typedef void (* ExifContentForeachEntryFunc) (ExifEntry *, void *user_data);
void exif_content_foreach_entry (ExifContent *content, ExifContentForeachEntryFunc func, void *user_data);
Run Code Online (Sandbox Code Playgroud)
我的第一次采取是:
sub exif_content_foreach_entry(ExifContent $exifcontent, &func (ExifEntry $entry, Buf $data), Buf $user_data) is native(LIB) is export { * }
Run Code Online (Sandbox Code Playgroud)
但是在调用时,此函数会生成错误:
Internal error: unhandled dyncall callback argument type
in method CALL-ME at /opt/rakudo-pkg/share/perl6/sources/24DD121B5B4774C04A7084827BFAD92199756E03 (NativeCall) line 588
Run Code Online (Sandbox Code Playgroud)
如果我忽略user_data参数,一切正常,所以声明的其余部分都没问题:我只是不能将任何额外的数据传递给回调函数.
在其他情况下,我使用Buf将(可能的)二进制数据块传递给C函数并且它工作; 这里的区别是回调函数.知道如何解决这个问题吗?
(使用perl6 2018.03)
这些代码段可能看起来很奇怪,这是因为我从原始代码开始并切断了碎片,直到我找到了再现错误的最小指令集.所以忍受明显的无用.有两个perl6模块,一个use是另一个,还有一个程序.这是第一个模块:
unit class test1;
use NativeCall;
use test2;
method test
{
my Pointer[void] $dummy .= new;
}
Run Code Online (Sandbox Code Playgroud)
第二个模块包含在第一个模块中,但实际上并未使用它的任何部分:
unit module test2;
use NativeCall;
class A is repr('CStruct') is export {
has Pointer[void] $.wrongdoer;
has int32 $.a;
}
Run Code Online (Sandbox Code Playgroud)
该程序创建一个test1对象并调用测试方法:
use lib '.';
use test1;
my test1 $t .= new;
$t.test;
Run Code Online (Sandbox Code Playgroud)
该程序输出一个错误,显然是由类test1的方法测试中的赋值引起的:
Type check failed in assignment to $dummy; expected NativeCall::Types::Pointer[NativeCall::Types::void] but got NativeCall::Types::Pointer[NativeCall::Types::void].new(0)
Run Code Online (Sandbox Code Playgroud)
如果我$.wrongdoer在第二个类中注释掉,程序执行时没有错误.我正在运行rakudo 2018.06.这是NativeCall模块中的错误还是其他我看不到的错误?
请考虑以下代码:
sub c1(Complex @a) { say @a.WHAT }
sub c2(Complex @a is copy) { say @a.WHAT }
my Complex @a = 1+2i, 2+3i, 4+2i;
c1(@a); # prints (Array[Complex])
c2(@a); # prints (Array)
Run Code Online (Sandbox Code Playgroud)
这是一个错误还是预期的行为?
我正在编写一个 C 库的接口。AC 函数分配一些内存,读取一个值,并返回一个void *指向该缓冲区的指针,随后将被释放。
我希望确保当我将调用的输出分配给nativecast(Str, $data)Raku Str 变量时,数据被分配给变量(复制到),而不仅仅是绑定到它,所以我可以释放 C 函数分配的空间任务完成后不久。
这大概是代码的样子:
my Pointer $data = c_read($source);
my Str $value = nativecast(Str, $data);
c_free($data);
# $value is now ready to be used
Run Code Online (Sandbox Code Playgroud)
我通过 valgrind 运行此代码,它没有报告任何尝试引用已释放的内存缓冲区的情况。我还是很好奇。