我一直在研究在Perl 6中构造惰性列表的各种方法,我想收集描述Fibonacci序列的所有简洁方法.
我将从马萨克的期刊中的三个开始:
my @fibs := (0, 1, -> $a, $b { $a + $b } ... *);
my @fibs := (0, 1, { $^a + $^b } ... *);
my @fibs := (0, 1, *+* ... *);
Run Code Online (Sandbox Code Playgroud)
我认为这样的东西也会起作用,但我认为我的语法有误:
my @fibs := (0, 1, (@fibs Z+ @fibs[1..*]));
Run Code Online (Sandbox Code Playgroud)
有什么东西急切(切片?)并导致Rakudo进入无限循环.它是Haskell定义的翻译:
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
Run Code Online (Sandbox Code Playgroud)
更新:
看起来像zipWith示例的问题是@fibs[1..*]切片.if tail定义为sub tail (@x) {my $i = 1; {@x[$i++]}...*}然后它正常工作.我很想知道为什么切片对任何熟悉Rakudo内部的人来说都不是懒惰的.
另一个不错的是:
my …Run Code Online (Sandbox Code Playgroud) 我最近和Rakudo Perl 6一起玩,正在寻找类似于CPAN的项目.我找到了CPAN 6,但我认为还没有Perl 6代码.
所以我正在寻找一些替代方案,它不一定是长期解决方案,但能够维护模块,并用Perl 6编写.
随着Rakudo的发展,很快就可能创建更复杂的Perl 6代码.
我想知道如何完全展平列表和包含它们的东西.除此之外,我想出了这个解决方案,它可以滑动具有多个元素的东西并将它们放回去,或者在滑动之后用一个元素取出它.
这与我如何"压扁"perl 6中的列表列表略有不同?,这是完全平坦的,因为任务是重组.
但是,也许有更好的方法.
my @a = 'a', ('b', 'c' );
my @b = ('d',), 'e', 'f', @a;
my @c = 'x', $( 'y', 'z' ), 'w';
my @ab = @a, @b, @c;
say "ab: ", @ab;
my @f = @ab;
@f = gather {
while @f {
@f[0].elems == 1 ??
take @f.shift.Slip
!!
@f.unshift( @f.shift.Slip )
}
}
say "f: ", @f;
Run Code Online (Sandbox Code Playgroud)
这给出了:
ab: [[a (b c)] [(d) e f [a (b c)]] [x …Run Code Online (Sandbox Code Playgroud) 在LaTeX中写论文的时候,我有这个.bib文件供参考管理:
@article{garg2017patch,
title={Patch testing in patients with suspected cosmetic dermatitis: A retrospective study},
author={Garg, Taru and Agarwal, Soumya and Chander, Ram and Singh, Aashim and Yadav, Pravesh},
journal={Journal of Cosmetic Dermatology},
year={2017},
publisher={Wiley Online Library}
}
@article{hauso2008neuroendocrine,
title={Neuroendocrine tumor epidemiology},
author={Hauso, Oyvind and Gustafsson, Bjorn I and Kidd, Mark and Waldum, Helge L and Drozdov, Ignat and Chan, Anthony KC and Modlin, Irvin M},
journal={Cancer},
volume={113},
number={10},
pages={2655--2664},
year={2008},
publisher={Wiley Online Library}
}
@article{siperstein1997laparoscopic,
title={Laparoscopic thermal ablation of …Run Code Online (Sandbox Code Playgroud) 如何在Perl6中编写自定义访问器方法?
如果我有这个课程:
class Wizard {
has Int $.mana is rw;
}
Run Code Online (Sandbox Code Playgroud)
我可以做这个:
my Wizard $gandalf .= new;
$gandalf.mana = 150;
Run Code Online (Sandbox Code Playgroud)
假设我想在我的Perl6类中为一个setter添加一点检查而不放弃$gandalf.mana = 150;表示法(换句话说,我不想写这个:) $gandalf.setMana(150);.如果它试图设定负面法术力,该程序应该死亡.我该怎么做呢?Perl6文档提到它可以编写自定义访问器,但没有说明如何.
我正试图在Perl 6中感到舒服.当我在REPL提示符下时,我在Python中发现的一件事就是我可以做一个dir(对象)并找出一个对象的属性,在Python中包含对象的方法.
这通常有助于提醒我想做什么; "哦,这是正确的,Python中的修剪被称为条带",就像那样.
在Perl 6中,我知道内省方法.WHO,.WHAT,.WHICH,.HOW和.WHY,但这些是在类或对象级别.我如何找出对象内部的内容,以及我可以对它做些什么?
我正在尝试在Raspberry Pi 3上安装Rakudo Star 2018.04.
我做:
sudo perl Configure.pl --gen-moar --gen-nqp --prefix ~/rakudo
Run Code Online (Sandbox Code Playgroud)
它成功完成.
然后我尝试:
sudo make-install
Run Code Online (Sandbox Code Playgroud)
但它失败了:
The following step can take a long time, please be patient.
/home/pi/rakudo/bin/moar --libpath="blib" --libpath="/home/pi/rakudo/share/nqp/lib" --libpath="/home/pi/rakudo/share/nqp/lib" perl6.moarvm --nqp-lib=blib --setting=NULL --ll-exception --optimize=3 --target=mbc --stagestats --output=CORE.setting.moarvm gen/moar/CORE.setting
Stage start : 0.000
Stage parse : 459.019
Stage syntaxcheck: 0.000
Stage ast : 0.000
Stage optimize : Killed
Makefile:504: recipe for target 'CORE.setting.moarvm' failed
make[1]: *** [CORE.setting.moarvm] Error 137
make[1]: Leaving directory '/home/pi/rakudo-star-2018.04/rakudo'
Makefile:43: recipe for target …Run Code Online (Sandbox Code Playgroud) 我安装了Perl6 rakudobrew并且浏览已安装的文件以查看十六进制文件名列表~/.rakudobrew/moar-2018.08/install/share/perl6/site/sources以及~/.rakudobrew/moar-2018.08/install/share/perl6/sources/.
例如
> ls ~/.rakudobrew/moar-2018.08/install/share/perl6/sources/
09A0291155A88760B69483D7F27D1FBD8A131A35 AAC61C0EC6F88780427830443A057030CAA33846
24DD121B5B4774C04A7084827BFAD92199756E03 C57EBB9F7A3922A4DA48EE8FCF34A4DC55942942
2ACCA56EF5582D3ED623105F00BD76D7449263F7 C712FE6969F786C9380D643DF17E85D06868219E
51E302443A2C8FF185ABC10CA1E5520EFEE885A1 FBA542C3C62C08EB82C1F4D25BE7B4696F41B923
522BE83A1D821D8844E8579B32BA04966BAB7B87 FE7156F9200E802D3DB8FA628CF91AD6B020539B
5DD1D8B49C838828E13504545C427D3D157E56EC
Run Code Online (Sandbox Code Playgroud)
这些文件包含软件包的源代码,但这种方式并不容易访问.那是什么理由?
我知道在Perl 6使用该后端时可以调用Java:如何从perl6调用Java方法
有没有办法访问例如Perl 6中的JavaScript DOM接口,并在浏览器中运行新的Rakudo JavaScript VM?
也许是这样的:
use v6;
use javascript::dom:from<JavaScript>;
Run Code Online (Sandbox Code Playgroud) 使子程序/过程可重用是模块的一项核心功能,我认为这是一种语言可组合的基本方式,因此可以在程序员的时间内有效:
如果您在模块中创建类型,则可以创建自己的模块,该模块添加一个可对您的类型进行操作的子类。我不必扩展您的模块即可做到这一点。
# your module
class Foo {
has $.id;
has $.name;
}
# my module
sub foo-str(Foo:D $f) is export {
return "[{$f.id}-{$f.name}]"
}
# someone else using yours and mine together for profit
my $f = Foo.new(:id(1234), :name("brclge"));
say foo-str($f);
Run Code Online (Sandbox Code Playgroud)
正如在一类的“重载运算符”中所看到的,模块的可组合性对于运算符同样适用,这对我来说很有意义,因为无论如何,运算符只是某种形式的sub语法糖(至少在我的脑海中如此)。请注意,此类运算符的定义不会导致现有代码的行为发生任何令人惊讶的变化,您需要将其显式导入到代码中才能访问它,就像上面的子代码一样。
鉴于此,我发现我们没有类似的方法机制非常奇怪,请参见例如如何在Perl 6中向现有类添加方法的讨论。,尤其是因为perl6是一种方法友好的语言。如果要扩展现有类型的用法,则需要使用与编写原始模块相同的样式来实现。如果Int上有一个.is-prime,那么我必须可以添加一个是半素数,对吗?
我在上面的链接上阅读了讨论,但不太喜欢“远距离操作”的论点:与我从模块中导出另一个多子对象有什么不同?例如,将其变成词法更改的特有方式(特质+隐含... for)对我来说似乎很卫生,并且与上面的运算符方法非常一致。
(至少对我而言)比技术更有趣的是语言设计是否存在的问题:为现有名词(类型)提供新动词(子代,运算符,方法)的能力不是perl6等语言的核心设计目标吗?如果是,为什么会以不同的方式对待方法?如果确实有很好的理由对它们进行区别对待,这是否意味着我们正在使用许多非可组合方法作为名词,而应该使用subs?
perl6 ×10
raku ×10
rakudo ×3
bibtex ×1
cpan ×1
fibonacci ×1
flatten ×1
javascript ×1
latex ×1
list ×1
perl ×1
rakudo-star ×1
raspberry-pi ×1
tex ×1