小编rai*_*iph的帖子

令牌和规则之间的真正区别是什么?

我被 Raku 所吸引是因为它的内置语法,并认为我会玩弄它并编写一个简单的电子邮件地址解析器,唯一的问题是:我无法让它工作。

在找到真正有效的东西之前,我尝试了无数次迭代,但我很难理解为什么。

它归结为,正在更改tokenrule

这是我的示例代码:

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)

grammar raku

16
推荐指数
2
解决办法
377
查看次数

Perl6搜索然后替换为子例程的输出

我已经整理了文档,但似乎找不到在perl6中执行此操作的方法。

在perl5中,我会做的(只是一个例子):

sub func { ... }

$str =~ s/needle/func($1)/e;
Run Code Online (Sandbox Code Playgroud)

即用对“ func”的调用输出替换“ needle”

regex evaluation replace string-substitution perl6

15
推荐指数
2
解决办法
199
查看次数

15
推荐指数
1
解决办法
347
查看次数

POD中的perl6签名

因为-->是perl6中签名中声明返回类型的首选方法,我想知道是否可以将函数签名的代码放入其中C<...>.

例如 C<foo(Int $a --> Bool)>

return escaping quoting code-documentation perl6

14
推荐指数
1
解决办法
158
查看次数

Raku(do) 所依赖的延续的具体细节是什么?

在 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当前的底层语义 [执行?] 模型至少需要无 …

rakudo delimited-continuations raku

14
推荐指数
1
解决办法
344
查看次数

duckmap真的做了什么?

文档中

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

11
推荐指数
1
解决办法
211
查看次数

是否有下标语法从2D数组中提取对角线?

我通常可以按照语法在文档页面上“向下钻取/切片”为具有多个维度(并展平)的数组。一个非常酷的功能。例如给出:

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)?

arrays perl6 arrayaccess matrix-indexing

11
推荐指数
1
解决办法
107
查看次数

JavaScript 箭头函数的 raku 等价物是什么?

在 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

javascript functional-programming raku

10
推荐指数
1
解决办法
177
查看次数

Raku:访问多维哈希值时遇到问题

我在访问二维哈希值时遇到问题。据我在网上了解到的情况,应该是这样的:%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)

hash raku

10
推荐指数
3
解决办法
418
查看次数

如何在Perl 6中切割成形数组?

我可以制作一个形状(固定大小)的数组:

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)

slice multidimensional-array perl6

9
推荐指数
2
解决办法
209
查看次数