在我测试的语言中,- (x div y )不等于-x div y; 我已经//在Python中,/在Ruby中,div在Perl 6中进行了测试; C有类似的行为.
这种行为通常是根据规范,因为div通常被定义为舍入向下分工的结果,但它不从的观点算术点做出很大的意义,因为它使div行为以不同的方式取决于标志,它引起混乱,如这篇文章如何在Python中完成.
这个设计决策背后是否有一些特定的理由,或者只是div从头开始定义?显然Guido van Rossum在博客文章中使用了一致性论证,解释了它是如何在Python中完成的,但如果你选择整理,你也可以有一致性.
Perl 6似乎爆发了相等的运算符.什么是=:=?leg和之间有什么区别cmp?还是eqv和===?
有没有人有一个很好的总结?
有(相对)众所周知的Perl公理,"只有perl可以解析Perl." 我想知道,Perl 6会保持这种情况吗?
扩展讨论......考虑到PyPy最近的更新,我想到了这个问题.Perl的独特解析能否阻止它进行类似的工作?在Perl代码(PPI?)的受限制的静态视图中有多大价值?Perl 6可以有一个JIT编译器吗?*
*我不确定这些概念是否相关.是吗?
与 Perl 5 相比,Raku 引入了渐进式类型。逐渐类型化的面向对象语言的景观非常丰富,包括:Typed Racket、C#、StrongScript、Reticulated Python。
Raku 官方网站上说“可选的渐进类型检查,无需额外的运行时间成本”。据我所知,由于强制类型系统健全性的策略,一些渐进式类型语言(如 Typed Racket 和 Reticulated Python)遭受了严重的性能问题。另一方面,由于相对便宜的名义子类型测试,StrongScript 中的具体类型表现良好。渐进式分类研究(不包括乐):
StrongScript 中的C#和具体类型:在类型构造函数上使用运行时子类型测试来补充静态类型。虽然静态类型代码以本机速度执行,但值是在类型和非类型边界上动态检查的。类型插入有效的强制转换并导致可以优化的代码。它们也很健全,开销也很低,但是在表达能力和从无类型迁移到有类型的能力方面付出了代价。
Typed Racket:监视值以确保它们按照指定的类型运行。包装器不是检查静态类型标签(如混凝土)的高阶和可变值,而是确保值与其声明类型的持久一致性。它避免了类型化代码中的强制转换。然而,它为这种健全性付出的代价是在类型化-非类型化边界插入重量级包装器。
网状Python:介于以上两者之间;它添加了类型转换,但仅针对顶级数据结构。网状 Python 的瞬态语义的性能对于具体类型来说是最坏的情况——即,几乎每次调用都会进行强制转换。它在使用时检查类型,因此向程序添加类型的行为会引入更多强制转换并可能减慢程序速度(即使在完全类型化的代码中)。
Raku 的运行时执行策略是类似于 C# 和 StrongScript 中的具体类型,还是它有自己的一套策略来确保没有像 Typed Racket 和 Reticulated Python 那样明显的性能问题?它有健全的渐变类型系统吗?
Parrot是最初为Perl 6设计的虚拟机.
Parrot VM提供哪些技术功能,如Java虚拟机(JVM)/热点VM和公共语言运行时(CLR)等竞争虚拟机缺乏?
Perl 6目前的状态是什么,它是否已投入生产?我们现在站在哪里?有许多程序员对Perl 6的当前进展感到好奇.
每次我下载Rakudo Perl 6的新副本时,我都运行以下表达式,只是为了了解它当前的性能:
say [+] 1 .. 100000;
Run Code Online (Sandbox Code Playgroud)
并且速度一直在增加,但每次计算都有明显的延迟(几秒).作为比较,Perl 5(或其他解释语言)中的类似内容几乎立即返回:
use List::Util 'sum';
print sum(1 .. 100000), "\n";
Run Code Online (Sandbox Code Playgroud)
或者在Ruby中(也几乎是即时的):
(1 .. 100000).inject(0) {|sum,x| sum+x}
Run Code Online (Sandbox Code Playgroud)
将表达式重写为Perl6的loop速度大约是缩小范围的两倍,但对于简单的计算,它仍然是一个非常明显的延迟(超过一秒):
my $sum;
loop (my $x = 1; $x <= 100000; $x++) {$sum += $x}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,Perl6实现的哪些方面导致了这些性能问题?并且这应该随着时间的推移而改善,还是这个开销是Perl6使用的"一切都是对象"模型的不幸副作用?
最后,loop构造比[+]减速算子更快吗?我认为循环将导致更多的总操作而不是减少.
编辑:
我会接受这两个mortiz年代和hobbs'如果我能的回答.一切都是作为一个方法调用处理更直接地回答为什么[+]慢,所以一个人得到它.
在阅读有关Perl 6的内容时,我看到一个被大肆宣扬的功能,您不再需要这样做:
return "0 but true";
Run Code Online (Sandbox Code Playgroud)
...但可以改为:
return 0 but True;
Run Code Online (Sandbox Code Playgroud)
如果是这样的话,Perl 6中的真相如何运作?在Perl 5中,它很简单:0,""和undef都是假的,其他一切都是真的.
在布尔上下文中,Perl 6中有哪些规则?
来自Perl 5背景,迁移到Perl 6或Python有什么好处?
编辑:如果你认为这只是因为你认为它只是火焰棒,请阅读下面的答案.他们不是在争论; 他们写得很好,讨论了每种语言的优缺点.为Stack Overflow社区提供一些功劳.
在学习 Raku 的同时,我到达了高阶函数和排序函数的点。
我有这个例子:
> sort <4 6 2 9 1 5 11>
(1 2 4 5 6 9 11)
Run Code Online (Sandbox Code Playgroud)
然后例程的文档是这样说的:
Sorts the list, smallest element first. By default infix:<cmp> is used for
comparing list elements.
Run Code Online (Sandbox Code Playgroud)
我正在关注的那本书“Piensa en raku”在第 9.2 节中对数字排序和字典排序进行了比较。
我尝试了以下方法:
> sort &le, <4 6 2 9 1 5 11>;
===SORRY!=== Error while compiling:
Undeclared routine:
le used at line 1. Did you mean 'lc'?
Run Code Online (Sandbox Code Playgroud)
但是遇到这个问题,而不是按字典顺序排列的排序列表。所以可能对我来说理解这一点还为时过早,但应该可以像函数一样在 Raku 中传递一个运算符,因为文档还说它正在使用中缀:或者我需要做这样的事情,也许我' m 混淆运算符和子程序:
sub my-le($a,$b) {
$a le $b; …Run Code Online (Sandbox Code Playgroud)