我被 Raku 所吸引是因为它的内置语法,并认为我会玩弄它并编写一个简单的电子邮件地址解析器,唯一的问题是:我无法让它工作。
在找到真正有效的东西之前,我尝试了无数次迭代,但我很难理解为什么。
它归结为,正在更改token为rule。
这是我的示例代码:
grammar Email {
token TOP { <name> '@' [<subdomain> '.']* <domain> '.' <tld> }
token name { \w+ ['.' \w+]* }
token domain { \w+ }
token subdomain { \w+ }
token tld { \w+ }
}
say Email.parse('foo.bar@baz.example.com');
Run Code Online (Sandbox Code Playgroud)
不起作用,它只是打印Nil,但是
grammar Email {
rule TOP { <name> '@' [<subdomain> '.']* <domain> '.' <tld> }
token name { \w+ ['.' \w+]* }
token domain { \w+ }
token subdomain …Run Code Online (Sandbox Code Playgroud) 我已经整理了文档,但似乎找不到在perl6中执行此操作的方法。
在perl5中,我会做的(只是一个例子):
sub func { ... }
$str =~ s/needle/func($1)/e;
Run Code Online (Sandbox Code Playgroud)
即用对“ func”的调用输出替换“ needle”
在 Raku 发行版中,我如何依赖Foo::Bar或Foo::Baz不依赖两者?
因为-->是perl6中签名中声明返回类型的首选方法,我想知道是否可以将函数签名的代码放入其中C<...>.
例如 C<foo(Int $a --> Bool)>
在 1990 年代和 2000 年代,编程语言爱好者几乎没有讨论过分隔延续的话题。它最近重新成为编程语言讨论中的一个主要问题。
我希望有人至少可以权威地说出 Rakudo 背后的延续(与 Raku 相比)是否具有下面列出的六个特征中的每一个。在列表之后,我会多说一些我希望得到的答案。
从在线消息[1] 中逐字引用(带有格式修饰),该消息由推动向 JVM 添加延续的工作的人撰写:
非对称:当延续挂起或让步时,执行返回到调用者(of Continuation.run())。对称延续没有调用者的概念。当他们让步时,他们必须指定另一个延续以将执行转移到。对称延续和非对称延续都不比彼此更强大,每个都可以用来模拟另一个。
Stackful:延续可以在调用堆栈中的任何深度挂起,而不是在延续是无堆栈时(如 C# 中的情况)在分隔上下文开始的同一子例程中。即延续有自己的堆栈,而不仅仅是单个子程序帧。有堆栈的延续比无堆栈的更强大。
Delimited:continuation 捕获从特定调用开始的执行上下文(在我们的例子中,是某个 runnable 的主体),而不是一直到 的整个执行状态main()。带分隔符的延续严格来说比未分隔的延续更强大 ( http://okmij.org/ftp/continuations/undelimited.html ),后者被认为“没有实际用处”( http://okmij.org/ftp/continuations/against- callcc.html)。
Multi-prompt:Continuations 可以嵌套,并且在调用堆栈中的任何地方,任何封闭的 continuations 都可以被挂起。这类似于 try/catch 块的嵌套,并抛出某种类型的异常,将堆栈展开到最近的处理它的catch而不仅仅是最近的 catch。嵌套延续的一个例子是在虚拟线程中使用类似 Python 的生成器。生成器代码可以做一个阻塞 IO 调用,这将挂起封闭线程的延续,而不仅仅是生成器:https : //youtu.be/9vupFNsND6o?t=2188
一次性/不可重入:每次我们继续一个暂停的延续时,它的状态都会发生变化,我们不能从同一个暂停状态多次继续它(即我们不能回到过去)。这与可重入延续不同,每次我们暂停它们时,都会返回一个表示特定暂停点的新的不可变延续对象。即延续是一个时间点,每次我们继续它时,我们都会回到那个状态。可重入的延续严格来说比不可重入的更强大;即他们可以做一些完全不可能的事情,只需一次连续即可。
Cloneable:如果我们能够克隆一次性延续,我们可以提供与可重入延续相同的能力。即使每次我们继续它时延续都会发生变化,我们可以在继续创建该时间点的快照之前克隆它的状态,以便稍后返回。
Aiui continuations 没有直接暴露在 Raku 中,所以可能与 Raku 相关的正确答案(与 Rakudo 相对)是“没有延续”。但这对我来说并不清楚,所以在下文中,如果我很幸运,我会在其中描述我希望答案中的内容,我会假装在 Raku 的上下文中谈论它们是有道理的和乐堂是两个截然不同的领域。
这是我想象的那种答案是可能的(尽管我只是有点疯狂地猜测实际情况):
“作为“100 年”语言设计,Raku当前的底层语义 [执行?] 模型至少需要无 …
从文档中
duckmap将对每个元素应用和阻止,并返回一个新的列表,其中包含块的已定义返回值.对于未定义的返回值,如果该元素实现了Iterable,则duckmap将尝试进入该元素.
但是之后:
my $list = [[1,2,3],[[4,5],6,7]];
say $list.deepmap( *² ); # [[1 4 9] [[16 25] 36 49]]
say $list.duckmap( *² ); # [9 9]
Run Code Online (Sandbox Code Playgroud)
deepmap的表现与预期相似,但我无法理解duckmap正在做什么.这个问题与perl6/doc中的这个问题有关.它可以通过"它们无法更加不同"来解决,但我想找到一些例子,他们也会这样做,当他们不这样做时,试着去了解真正发生的事情.
recursion functional-programming duck-typing perl6 map-function
我通常可以按照语法在文档页面上“向下钻取/切片”为具有多个维度(并展平)的数组。一个非常酷的功能。例如给出:
my @a=[[1,2,3],
[4,5,6],
[7,8,9]];
Run Code Online (Sandbox Code Playgroud)
我可以使用以下方法选择上述的第2列
say @a[0,1,2;1]; #This output (2,5,8)
Run Code Online (Sandbox Code Playgroud)
是否有可能以类似的紧凑语法提取对角线(1,5,9)?
在 JavaScript 中,我可以去
const materials = [
'Hydrogen',
'Helium',
'Lithium',
'Beryllium'
];
console.log(materials.map(material => material.length));
// expected output: Array [8, 6, 7, 9]
Run Code Online (Sandbox Code Playgroud)
我猜 raku 在功能上有一些印记 - 我想知道是否有人可以澄清等效代码(请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions)
我在访问二维哈希值时遇到问题。据我在网上了解到的情况,应该是这样的:%myHash{"key1"}{"key2"} #Returns value
但是,我收到错误:“类型数组不支持关联索引。”
这是一个最小的可重复示例。
my %hash = key1-dim1 => key1-dim2 => 42, key2-dim1 => [42, 42];
say %hash{'key1-dim1'}{'key1-dim2'}; # 42
say %hash{'key2-dim1'}{'foo bar'}; # Type Array does not support associative indexing.
Run Code Online (Sandbox Code Playgroud)
这是另一个可重现的示例,但更长:
my @tracks = 'Foo Bar', 'Foo Baz';
my %count;
for @tracks -> $title {
$_ = $title;
my @words = split(/\s/, $_);
if (@words.elems > 1) {
my $i = 0;
while (@words.elems - $i > 1) {
my %wordHash = ();
%wordHash.push: (@words[$i …Run Code Online (Sandbox Code Playgroud) 我可以制作一个形状(固定大小)的数组:
my @array[3;3] = (
< 1 2 3 >,
< 4 5 6 >,
< 7 8 9 >
);
say @array; # [[1 2 3] [4 5 6] [7 8 9]]
say @array[1;1]; # 5
Run Code Online (Sandbox Code Playgroud)
如何切片以获得我想要的任何特定列或对角线(行很容易)?
如何将每个维度中的索引列表转换为正确的方括号?
而且,肯定有一些花哨的语法可以阻止我做一些复杂的事情:
my @diagonal = gather {
my @ends = @array.shape.map: { (0 ..^ $^a).List };
for [Z] @ends {
take @array[ $_ ] # how do I make that $_[0];$_[1];...
};
}
Run Code Online (Sandbox Code Playgroud) perl6 ×5
raku ×5
arrayaccess ×1
arrays ×1
dependencies ×1
duck-typing ×1
escaping ×1
evaluation ×1
grammar ×1
hash ×1
javascript ×1
map-function ×1
package ×1
quoting ×1
rakudo ×1
recursion ×1
regex ×1
replace ×1
return ×1
slice ×1