- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Raku 提供 many类型是 immutable因此在创建后无法修改。直到我最近开始研究这个领域,我的理解是这些类型不是 persistent data structures – 也就是说,与 Clojure 或 Haskell 中的核心类型不同,我认为 Raku 的不可变类型没有利用结构共享来允许廉价副本。我以为那句话my List $new = (|$old-list, 42);
从字面上复制 $old-list
中的值,没有持久数据结构的数据共享功能。
但是,由于以下代码,我对我的理解的描述是过去时:
my Array $a = do {
$_ = [rand xx 10_000_000];
say "Initialized an Array in $((now - ENTER now).round: .001) seconds"; $_}
my List $l = do {
$_ = |(rand xx 10_000_000);
say "Initialized the List in $((now - ENTER now).round: .001) seconds"; $_}
do { $a.push: rand;
say "Pushed the element to the Array in $((now - ENTER now).round: .000001) seconds" }
do { my $nl = (|$l, rand);
say "Appended an element to the List in $((now - ENTER now).round: .000001) seconds" }
do { my @na = |$l;
say "Copied List \$l into a new Array in $((now - ENTER now).round: .001) seconds" }
在一次运行中产生了这个输出:
Initialized an Array in 5.938 seconds
Initialized the List in 5.639 seconds
Pushed the element to the Array in 0.000109 seconds
Appended an element to the List in 0.000109 seconds
Copied List $l into a new Array in 11.495 seconds
也就是说,用旧值创建一个新的 List 与推送到一个可变数组一样快,而且比将 List 复制到一个新的数组快得多——这正是你期望从一个数组中看到的性能特征。持久列表(复制到数组仍然很慢,因为它不能在不破坏列表不变性的情况下利用结构共享)。
$l
的快速复制进入
$nl
不是因为 List 懒惰;两者都不是。
最佳答案
我记得实现了这些语义,而且我当然不记得当时考虑过它们会产生持久性数据结构 - 尽管将该标签附加到结果似乎是公平的!
我认为您找不到任何明确说明这种确切行为的地方,但是语言所需的事物的最自然实现很自然地会导致它。服用成分:
infix:<,>
运算符是 List
Raku 中的构造函数 List
被创建后,它对懒惰和扁平化不置可否(这些源于我们如何使用 List
,我们通常不知道它的构造点)(|$x, 1)
, prefix:<|>
运算符构造一个 Slip
,这是一种 List
应该融入周围 List
.那么什么infix:<,>
看到的是 Slip
和一个 Int
. Slip
融入结果List
立即意味着对渴望做出 promise ,即 List
单独施工不应该。因此Slip
以及将其放入 List
的懒惰评估(“非具体化”)部分之后的所有内容. Slip
的实现。并选择急切地复制已知不会偷懒的东西,并且仍然符合规范测试套件。这会改变你的例子的时间复杂度。如果你想对此进行防御,那么:
do { my $nl = (|$l.lazy, rand);
say "Appended an element to the List in $((now - ENTER now).round: .000001) seconds" }
即使实现发生了变化,也应该足以强制解决问题。
str
因此 Str
, 通过创建一个新字符串来实现字符串连接,该新字符串指的是被连接的两个字符串,而不是复制两个字符串中的数据(并对 substr
和重复执行类似的技巧)。这严格来说是一种优化,而不是语言要求,并且在一些微妙的情况下(一个字符串的最后一个字素和下一个的第一个字素将在结果字符串中形成单个字素),它放弃并采用复制路径。 Concurrent::Stack
这样的模块, Concurrent::Queue
, 和 Concurrent::Trie
使用尾部共享作为实现相对高效的无锁数据结构的技术。 关于functional-programming - Raku/Rakudo 包含哪些持久数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67030459/
虽然总是可以使用 mixin 或方法覆盖来修改 Bool 强制转换,但默认情况下哪些值被认为是真值,哪些值被认为是假值? 注意:这个问题是 asked previously ,但不幸的是它太旧了,它的
也许我遗漏了一些东西,但我想知道这段代码是否有充分的理由 编译 role L { method do-l (Int, Int --> Int ) { ... } } class A does L
FAQ:在 Raku 中如何检查列表是否为空? 是否有比以下更惯用的方法: my @l = (); say @l.elems == 0; say @l == (); say @l.Bool; doc
FAQ:在 Raku 中,如何从列表中删除重复项以仅获取唯一值? my $arr = [1, 2, 3, 2, 3, 1, 1, 0]; # desired output [1, 2, 3, 0] 最
我使用 Raku 进行一些计算,因为它有很好的数字类型。但是,我在使用“.raku”时遇到问题 say (1/6+1/6).raku # 我们得到这个。然而, say (1/10+1/10).raku
常见问题解答:在 Raku 中,如何将字符串转换为十六进制的字节列表(即十六进制解码器) 目前,我有: say "I ❤ 🦋".encode.list.map(*.base(16)); # (49
在 1990 年代和 2000 年代,编程语言爱好者几乎没有讨论过分隔延续的话题。它最近重新成为编程语言讨论中的一个主要问题。 我希望有人至少可以权威地说出 Rakudo 背后的延续(与 Raku 相
我选择在 Perl 6 中重新设计我之前代码的一部分,在这种情况下是一个棋盘。前两个类运行良好(或者至少工作正常,我知道的很少,我无法确定它们的正确性) ,但我坚持第三。这是代码: #!/home/h
如何重现数组的每个元素 x 次? 例如 for my @a=;和 x=5 ,结果应该是这样的 (blu blu blu blu blu red red red red red) 我想出了这个 say
我正在尝试使用一个变量并在一个步骤中为其分配一个表达式: 给定的(示例)代码 my @l=; my $i=0; while $i ; my $i=0; say @l[$i =~ ($i+1) * 2]
我想连续打印偶数,但我不能。 use Terminal::ANSIColor; # Wanna print even numbers in red for { $_ %2 == 0 ?? say c
目前(截至 2020 年 8 月)Rakudo 不在编译时对函数的返回值进行类型检查;也就是说,它不提供函数满足其返回约束的静态保证。具体来说,以下两个函数都编译为 Raku: sub get-int
自从我上次更新我在 Raku 生态系统中的一个模块以来已经有一段时间了。我需要更新中央注册表文件/存储库还是会自动检测到更新? 最佳答案 修改版本号后,我等了一个小时左右,然后 zef可以安装模块 -
有人能告诉我如何在正在执行的 Raku 脚本中找到脚本的路径吗? 我正在 Raku 中寻找与此 Perl 代码等效的代码: $path=abs_path($0); 最佳答案 使用 $*PROGRAM见
Raku的正则表达式有两种交替形式:|和||。有什么区别 ? say 'foobar' ~~ / foo || foobar / # 「foo」 say 'foobar' ~~ / foo | fo
我故意避免使用术语 defined因为一个变量很可能有一个定义的值,但 .defined方法将返回 false(例如,失败)。 有什么方法可以确定变量是否已为其设置了值? my $foo; say $
我从/path/to/data 运行/home/foo/bar.p6 并显示“Segmentation fault (core dumped)” 我在/var/crash 或我的主目录或当前工作目录中
在 cli 上,在 linux 中,cp -p保留文件上修改/访问的时间戳。是否可以直接在 Raku 中执行相同操作? Rosetta 示例使用 Nativecall,它可以通过系统调用来完成,但看起
我想重用 token parameter来自 Perl6::Grammar在我的自定义俚语中添加“自定义参数”参数不带 cargo 培养 . 我的意思是说: my $main-grammar = $*
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 去年关闭。 Improve this questio
我是一名优秀的程序员,十分优秀!