问题标签 [rakudo]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
object - 有谁知道为什么 TWEAK 例程在 BUILD 例程之前被击中?
最小代码:
和输出:
相关文档位于https://docs.raku.org/language/objects#Object_construction。我引用:“在调用 BUILD 方法之后,调用名为 TWEAK 的方法(如果它们存在),再次使用传递给 new 的所有命名参数”。
我正在使用 Fedora 32 附带的 rakudo 版本(rakudo-0.2020.02-1.fc32.x86_64 所以可能是今年 2 月)。
slice - 切片索引的惰性如何影响数组/列表的切片?[乐]
当我们使用超出数组边界的索引对数组进行切片时,我们会得到未定义 (Any)
当我们将相同的切片索引作为惰性列表传递时,我们会得到数组/列表的现有值(仅此而已):
很明显,切片索引的惰性会影响结果。
试图理解事物的本来面目,作为概念证明,我编写了切片机制的简单版本:
但我想知道我的幼稚算法是否描述了事物在幕后计算的方式!
promise - 为什么我不允许违反 Promise?
以下简单的 Promise 是发誓的,我不允许破坏它。
这是为什么?
operators - 是否可以在 Raku 中定义一个新的运算符并控制其优先级?
考虑这个新的运算符:
此代码打印:
但是,是否可以控制优先级?它的行为如下:
无需使用括号
regex - Raku 正则表达式:如何知道哪个组被交替捕获
使用 perl(以及几乎任何正则表达式风格),每个组都按顺序编号。
例如,这段代码:
印刷xbar
但是,对于 Raku,它的行为就像有一个分支重置组包装了整个正则表达式:
印刷barx
我对这种行为没意见:)。但是,有时了解在交替下捕获了哪个组是有用的。
我怎样才能知道有 raku 的组?
list - 如何在 Raku 中无限地懒惰地循环列表?
这主要是为了了解Raku有多棒。
问题
是否有内置方法可以获取一个列表并无限期地循环遍历它,例如生成惰性列表
出(a, b, c)
?列表文档中的任何内容似乎都没有明显的作用。
可能的解决方案
我至少能想到一对。
更单调的脚踏实地的方法是在惰性范围上进行映射 。在REPL 中:@array[<variable> mod length-of-@array]
0..Inf
perl6
一个更酷(我认为)的解决方案是让您首先将您的列表变成一个slip,然后无限期地将重复运算符应用于该 slip:
结论
尽管我可以实现这一点(特别是最后一个解决方案非常简洁和令人满意),但我想知道我是否遗漏了专门为此目的而构建的任何东西。
编辑回复:接受的答案
这是为了稍微详细说明@Brad Gilbert 的答案。该运算符在超运算«~»
符中包装字符串连接 ,这导致将包装的二元运算符应用于从两个列表中顺序选择的元素。~
« »
所以为了实现我想要的(列表循环到所需的长度,比如 100),一个人会做
这产生
(100 个条目)。但它确实有几个缺点:
- 由于应用了
~
- 它实际上并没有产生一个惰性无限列表:
返回
regex - Raku:在正则表达式中使用主题变量(来自“for”)
我有这个按预期工作的代码:
它打印:
但是,如果我尝试在 for 循环中使用主题变量,如下所示:
我明白了:
使用后缀的结果相同:
这是正则表达式中主题变量的特例吗?
它是否应该保存与之匹配的整个字符串?
regex - Raku 正则表达式:不一致的最长令牌匹配
Raku 的正则表达式应该匹配最长的标记。
事实上,在这段代码中可以看到这种行为:
但是,当文本在变量中时,它的工作方式似乎不同:
为什么它们以不同的方式工作?有没有办法使用变量并且仍然匹配最长的标记?
raku - 在 raku REPL 中定义后缀运算符的问题
如果我在 raku 中有以下程序,它运行良好:
但是如果我在 raku REPL 中定义这个函数,我会得到:
对于阶乘函数,它可以正常工作并且符合预期,但我得到了这个!操作员:
我需要一个特殊的 sintax 来定义 raku REPL 中的运算符,或者取决于环境的加载方式。
我在 OSX Catalina 中使用
publish-subscribe - Supply method act 与 tap 之间的区别
在关于供应方法法案(vs tap) https://docs.raku.org/type/Supply#method_act的 Raku 文档中指出:
保证给定的代码一次只能由一个线程执行
我的理解是,一个线程必须在另一个线程必须运行它之前完成特定的代码对象。
如果是这样的话,当我尝试实现该功能时,我偶然发现了一种不同的行为。查看以下代码片段,其中创建了 2 个“动作”并在不同的线程中运行:
结果如下(增加了时间间隔和评论):
可以很容易地观察到代码对象(子例程&actor)在 2 个线程中同时运行(例如,请参见输出第 4 行和第 7 行)。
有人可以澄清我对此事的误解吗?