我试图将 for 循环中的参数放入 FIXED 大小的数组中。这就是我一直在做的事情(我想使用一个包含 3 个元素的数组 @m):
for (1..19).rotor(3, :partial) -> @m { say @m; } # works, but I cannot specify size of @m
Run Code Online (Sandbox Code Playgroud)
但是,以下所有内容都给了我错误:
for (1..19).rotor(3, :partial) -> @m[0,1,2] { say @m; }
===SORRY!=== Error while compiling:
Variable '@m' is not declared
------> ).rotor(3, :partial) -> @m[0,1,2] { say ?@m; }
for (1..19).rotor(3 => -2) -> @m[0..2] { say @m; }
===SORRY!=== Error while compiling:
Variable '@m' is not declared
------> 1..19).rotor(3 => -2) -> @m[0..2] { …Run Code Online (Sandbox Code Playgroud) 我记得在大学时代,线程共享资源和内存。我不知道线程的 Raku 实现的细节,但是如果同时多个线程使用不同的参数调用同一个全局函数,它们会不会相互干扰,因为全局函数是所有线程共享的单个代码块线程?例如,这个例子没有显示干扰,但是一些复杂的代码呢?
sub add ($a, $b) { $a + $b };
for 1..100 { start { sleep 1.rand; say "I am $_, {add($_, 1000)}"; } };
Run Code Online (Sandbox Code Playgroud) 考虑
subset MySubset of Str where * ~~ /^ \d $<interesting> = ( \d+ ) $/;
Run Code Online (Sandbox Code Playgroud)
现在我想在我的签名中使用子集作为类型,但是通过解包将捕获的部分放入一个变量中,有点像
sub f( MySubset $( :$interesting ) )
{
say $interesting;
}
f( "12345678" ); # should say 2345678
Run Code Online (Sandbox Code Playgroud)
这当然行不通。甚至有可能做到这一点吗?
您可以将代码保存到文件中并使用raku -c. 有没有办法使用一些公共 API 以编程方式做同样的事情?
我有这个代码:
# Grab Nutrients.csv from https://data.nal.usda.gov/dataset/usda-branded-food-products-database/resource/c929dc84-1516-4ac7-bbb8-c0c191ca8cec
my @nutrients = "/path/to/Nutrients.csv".IO.lines;
for @nutrients.race {
my @data = $_.split('","');
.say if @data[2] eq "Protein" and @data[4] > 70 and @data[5] ~~ /^g/;
};
Run Code Online (Sandbox Code Playgroud)
Nutrients.csv 是一个 174 MB 的文件,有很多行。每一行都完成了重要的事情,但没有数据依赖性。然而,这大约需要 54 秒,而非竞赛版本使用 43 秒,减少了 20%。知道为什么会这样吗?在这里完成的操作对于数据并行性来说是否仍然太少?我见过它只适用于非常繁重的操作,比如检查某些东西是否是素数。在那种情况下,是否应该为每条数据做多少工作才能使数据并行化值得呢?
在 Julia 中,您可以像这样按月生成日期范围:
julia> dr = Date(2014,1,29):Dates.Month(1):Date(2014,07,29)
Date("2014-01-29"):Month(1):Date("2014-07-29")
julia> collect(dr)
7-element Array{Date,1}:
2014-01-29
2014-02-28
2014-03-29
2014-04-29
2014-05-29
2014-06-29
2014-07-29
Run Code Online (Sandbox Code Playgroud)
Date(2014,1,29)是开始日期,Dates.Month(1)是步骤,Date(2014,07,29)是结束日期。
Raku后面有一个方法,但是在自定义生成器中使用时,会导致无限范围:
lazy my @dates = Date.new('2014-01-29'), Date.new('2014-02-28'), { $^a.later(:1month) } ... Date.new('2014-07-29')
Run Code Online (Sandbox Code Playgroud)
如果我在...运算符的右侧使用* >= Date.new('2014-07-29')而不是,它会起作用:Date.new('2014-07-29')
lazy my @a = Date.new('2014-01-29'), Date.new('2014-02-28'), { $^a.later(:1month) } ... * >= Date.new('2014-07-29')
2014-01-29
2014-02-28
2014-03-28
2014-04-28
2014-05-28
2014-06-28
2014-07-28
2014-08-28
Run Code Online (Sandbox Code Playgroud)
为什么自定义生成器{ $^a.later(:1month) }在{ $^a.later(:1month) } ... Date.new('2014-07-29') …
原帖中描述的问题已解决。我在运行 Raku 脚本时没有问题:
我在 Raku 中编程,并尝试在 Mac OS 10.15.6 上使用带有 IntelliJ IDEA 2020.2 和 2020.2.1(社区版)的Comma Community 版本 2020.07.0。
当我尝试运行已配置的脚本时,出现错误“运行‘示例’时出错:com/sun/javafx/PlatformUtil”:

我在网上进行了大量搜索以找到解决此问题的建议,但我尝试过的一切都没有奏效。所以,我恢复使用 IntelliJ IDEA 2020.1.4 。
任何建议如何让 Commaide 在 IntelliJ IDEA 2020.2.1 中工作?
我实在想不通。显然,zef执行某种模块的排列和预编译,但在这种情况下它真的很关键,因为它似乎只是使用不同版本的代码。例如,运行失败的测试之一,
raku -Ilib t/01-basic.t # ok 1 - get-all() found Licenses
Run Code Online (Sandbox Code Playgroud)
但是,zef test .该测试失败(以及许多其他测试也可以在本地运行时运行)
? License-Software-mine git:(master) ? zef test .
===> Testing: License::Software:ver<0.3.0>:auth<kalkin>
[License::Software] # Failed test 'get-all() found Licenses'
[License::Software] # at t/01-basic.t line 8
[License::Software] # You failed 1 test of 1
[License::Software] Can not find license alias 'gplv3'
[License::Software] in sub license at /home/jmerelo/progs/forks/perl6/License-Software-mine/lib/License/Software.pm6 (License::Software) line 174
[License::Software] # Failed test at t/10-gplv3.t line 8
[License::Software] Method 'aliases' must be …Run Code Online (Sandbox Code Playgroud) %*RESOURCES作为动态变量,您可以访问Distribution::Resource特定分布中的每个对象。这些对象与它一起安装,因此它们就在那里,可用。
但是,我找不到一种记录在案的方式,更不用说特定的方式,可以从一个发行版访问另一个发行版的资源。例如,假设您希望从Foo作为分发资源安装的数据进行访问Bar。我可以想象实例化一个Distribution::Resources对象;为了实例化它,你需要repo(好吧,我可以忍受),但是dist-id. 很可能有一种从 dist-name 中获取 dist-id 的规范方法......但我在这里迷路了。任何人都可以帮忙吗?
更新:我正在检查这个,它归结为:使用zef。它包括用于“查找”“身份”(由名称和元数据标识的发行版)所在位置的逻辑,您可以从那里通过解析输出来定位 ID。但是,那里没有文档,也不清楚它的公共 API 是什么,除了它可能在此代码中的某个地方。
然而,很明显,首先您必须找到您需要资源的发行版,从那里您将获得一个 ID,然后使用该 ID 来实例化上面的对象。伊什。
软呢帽 33 乐
我正在尝试使用 Raku 的 NativeCall 与 libX11.so 对话以打印出我的屏幕和显示:
use NativeCall;
class Display is repr('CStruct') { has Pointer $.DisplayPtr };
# libX11.so --> X11
sub XOpenDisplay(Str $name = ':0') returns Display is native('X11') { * }
sub XDefaultScreen(Display $) returns int32 is native('X11') { * }
my Display $display = XOpenDisplay()
or die "Can not open display";
my int $screen = XDefaultScreen($display);
print "display = <" ~ $display ~ ">\n";
print "screen = <" ~ $screen ~ ">\n";
$ …Run Code Online (Sandbox Code Playgroud) raku ×10
arrays ×1
commaide ×1
compilation ×1
concurrency ×1
date ×1
destructure ×1
for-loop ×1
function ×1
javafx ×1
nativecall ×1
parameters ×1
sequence ×1
syntax ×1
unit-testing ×1
zef ×1