问题标签 [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.
arrays - 关于懒惰 [ RAKU ]
在 Raku 文档中指出,收集-获取构造正在被惰性评估。在以下示例中,我很难得出关于构造的惰性的结论:
在第一种情况下(将 Seq 分配给 @f1),如果我们去掉“惰性”定义,那么生成的序列(使用 collect-take)将永远运行(不是惰性)。
在第二种情况下(将 Seq 分配给 @f2)@f2 变得懒惰。
为什么我们在行为上有差异?尽管我们尝试做同样的事情:以惰性方式将 Seq 分配给数组
有人可以澄清一下吗???
openssl - 为什么在 MacOS Catalina 上使用 Cro 时 Raku 会因“中止陷阱:6”而崩溃?
我正在使用 macOS Catalina 并尝试执行一个简单的命令raku -e "use Cro::HTTP::Route"
。我将[1] 19228 abort raku
在 Zsh shell 或Abort trap: 6
Bash shell 中收到一条消息。使用 OpenSSL 模块(如raku -e "use OpenSSL::Stack"
.
raku - 解构对列表
考虑
按预期工作。然而,
投掷
这是一个错误还是我错过了什么?
这是 Rakudo Star 版本 2019.03.1,基于 MoarVM 版本 2019.03 实现 Perl 6.d。
perl - 为 Raku 构建多个后端失败
在阅读README.md
了https://github.com/rakudo/rakudo之后,我开始冒险为 rakudo 构建多个后端。
我使用 64 位 Ubuntu 20.04 来做到这一点。首先我安装
build essential
,libencode-perl
default-jdk
准备编译 rakudo 的机器。
克隆 repo 后,当我运行命令时perl Configure.pl --backends=moar,jvm --prefix=/usr
,出现以下错误:
如何修复?
我想知道ALL
命令perl Configure.pl --backends=ALL
中指的是什么。
这里和这里有一个项目(我猜还是在 master 中合并了)Rakudo.js 。这是 Javascript 后端吗?这是否意味着,和后端?ALL
moar
jvm
Javascript
raku - 带有自定义词法分析器的 Raku 语法
是否有可能为 raku 语法定义自定义词法分析器,即将字符串转换为 int id + 值流?我在玩语法结构。
规则看起来很直观,因为它们可能在递归下降解析器中转换为函数。但是,令牌和正则表达式我希望能够使用显式令牌 ID 和接口将它们映射到名称以便我可以编写自己的词法分析器?
raku - 为什么 Rakudo dd 为类型化和分配的标量返回 Nil?
下面是使用 Rakudo 的 REPL 会话。
为什么Nil
输出的第二行有一个dd
?
raku - 重载包函数以检测未使用任何参数
我正在尝试重载一个函数以检测没有传递任何参数:
如果您尝试使用multi main (*@args) {}
它也将不起作用。但是,如果您删除第一个multi MAIN
定义,一切都会顺利进行。知道如何解决吗?
require - require 的行为(静态 + 动态)[ RAKU ]
我的问题与require与所需命名空间的静态或动态分辨率一起使用时的行为有关。
我将尝试表达我对事物的理解:
[ 1 ] 将“require”与文字一起使用
在这种情况下,编译器会检查 MODULE 是否已被声明为符号。如果没有,编译器声明它,并将它绑定到一个空的占位符包,它只是为这个“要求”创建的
[ 2 ] 将“require”与字符串一起使用
在这种情况下,“require”试图(在运行时)查找由字符串中声明的文件名定义的文件。如果找到(具有适当的内容:模块、包等),则它会在当前范围内创建一个名称空间,并将其与文件的内容一起加载。
[ 3 ] 在动态查找中使用“require”
在我看来,在这种情况下,“require”的行为不是“正常”的子程序。
当我们将“require”与“动态查找”一起使用时,动态查找的核心功能将“融合”在一个新的例程中,该例程的行为与我们预期的不同。
事实是“动态查找”例程的结果不是符号就是失败。
如果“require”的行为类似于“正常”子例程,那么它可以使用的唯一输入将是其后的动态查找的结果(命名空间或失败)。
但事实上,在失败的情况下(作为动态查找的结果),“require”会继续在存储库中搜索适当的包(通常情况下,使用我们为动态查找提供的参数: '模块')。
因此,从这个意义上说,显然“要求”的行为不像“正常”子程序。
根据我的思路,require + 动态查找的组合类似于以下构造:
我关心的是我对案例[3]的理解。
require + 动态查找如何工作?(从分析上讲 - 编译器首先遵循的步骤是什么,然后是运行时?)
[ 后记 ]
我同意@raiph 的观点,“require”不是一个子例程,它与语言深度集成。
从这个意义上说,在 require “指令”之后的“动态查找结构”用于两件事:
通知编译器构造是“动态的”(所以不要在编译时修复任何东西)
提供将用于搜索符号、命名空间、文件或存储库内容的字符串
@raiph 表示他认为“require”在成功加载后会进行查找。
我对此的唯一反对意见是,当我们加载同一个库时,“require”不会引发任何异常。
它是否默默地忽略了加载的库?当它可以首先检查同一个命名空间是否已经在使用时,为什么还要费心做这么多工作呢?
相反,当我们假设我们加载了一个不同的库时,它会抛出一个异常:正在使用的符号的“重复定义”。
为了证明我进行了以下操作:
在 ./lib 目录中,我放置了两个库,“foo.pm6”是“foo”的单元定义,其中定义了 A 类:
和另一个库“other.pm6”,这次在“foo”的定义中定义了一个不同的类 B。
raku 程序文件包含以下内容:
从上面的示例中我们看到,当我们尝试重新加载 foo 命名空间时,它隐藏在具有不同名称的文件中(只是为了欺骗 raku),它会引发异常。
因此我得出结论,也许“需要”首先检查与提供的字符串同名的命名空间。
顺便说一句,检查一下,我偶然发现了一个奇怪的行为。如下:
如果我们使用“使用 foo;” 在 line: "Initial package loading" 而不是 "require ::('foo') ;" 中,我们得到以下结果:
在 (3) 中查找 'foo::A' 没有找到任何东西!
此外,如果我使用以下内容更改库文件:“other.pm6”(A 类而不是 B - 如 foo.pm6 中)
结果似乎恢复到预期:
是错误还是我缺少的其他东西?