问题标签 [nqp]

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.

0 投票
1 回答
274 浏览

raku - 在 NQP (Not Quite Perl) 中编写模块会加速 perl6 程序吗?

NQP 主要设计用于引导 perl6 语言,但我正在考虑是否可以将其用作优化。我知道 rakudo 还没有完美优化,但我正在寻找一种长期的方法。Perl6 有一些低级别的数据类型和一些编译器和后端级别的想法,这些想法可能会使这个想法变得毫无意义。

写 NQP 而不是 perl6 有意义吗?

0 投票
1 回答
351 浏览

sockets - 有没有办法在 Perl 6 中处理 Unix 套接字?

我想使用 Unix 套接字与mpv通信,但是 Perl 6 没有提供任何高级接口来做到这一点。所以我想我可以为此编写一个小模块,开始深入挖掘IO::Socket::INETnqp::socket找到nqp::connect.

但是,我在NQP 操作列表中找不到任何提及,它们似乎与传统的 BSD 套接字 API 截然不同。因此我想问:这两个能够创建一个 Unix 套接字并连接到它吗?如果是这样,怎么做?或者可能有另一种方式?

0 投票
0 回答
253 浏览

raku - 强制/类型检查:手动重现 Perl6 标准

我有一个模块AttrX::Mooish,它实现了 Moo/Moose 框架的一些属性特性(懒惰、触发器等)。我还希望模块对最终用户尽可能透明,这意味着支持私有和公共属性。它通过用 a 替换属性的容器Proxy并将其值存储在外部存储中来工作。这也意味着 Perl6 所做的所有类型检查和强制转换现在都是我的责任。我的目标是尽可能地模仿默认行为。即对于最终用户:

has MyClass @foo is mooish(...);

必须与没有应用特征的情况相同。不幸的是,类型操作的主题在语言核心中是如此复杂和不统一,以至于我解决的问题越多,我之后遇到的问题就越多。例如:

my Str @a = <a b c>; my Str @b = [1,2,3]

Type check failed in assignment to @b; expected Str but got Int (1)

正如预期的那样。

my Str @a; say @a.WHAT

(Array[Str])

当然。

my Array[Str] $a = ["a", "b", "c"];

Type check failed in assignment to $a; expected Array[Str] but got Array ($["a", "b", "c"])

出色地....

my Array[Str] $a = <a b c>;

Type check failed in assignment to $a; expected Array[Str] but got List ($("a", "b", "c"))

甚至不List强求Array

难怪我的特征代码中的最后一个类型检查行:

$coerced-value ~~ $attr.type

尽管变量/属性分配中使用的值/类型相同,但在这里和那里都失败了。

我有一个不希望得到任何肯定答案的问题:赋值运算符是否使用了一个入口点来执行所有强制/类型检查?理想情况下,我会简单地:

我试图从语法上追溯,但还没有足够的空闲时间来完成这项工作。另外,我不知道也不能真正理解的主要是nqp。

但由于不太可能存在这样的入口点,我想询问与该领域相关的任何建议。例如,#perl6 上的 SmokeMachine 为我提供了使用.^parents方法获取参数化类型的基本类型的好主意。

到目前为止,最大的问题在于:

  1. 要检查类型是否已参数化,我不能使用单个角色或类来匹配。到目前为止,我唯一的方法是查找是否有of方法并测试其输出。不幸的是,如果一个类提供了FALLBACK非常不清楚的错误消息(关于 AUTOGEN 的错误消息),则会产生。:no_fallback是可取的,但确定和子集类型有自己的find_method不支持命名参数,我最终得到另一个错误消息。
  2. 如果在我的 trait 角色的方法中准备类型相关的属性 ( $!coerce-type)compose应用于Attribute对象(实际上是在其中声明了属性),我稍后会在运行时统一化它们。猜测它与撰写时间有关。但是想确定这里是否遗漏了什么。
  3. 有没有比执行类型检查更好的方法$value ~~ $type
0 投票
1 回答
112 浏览

raku - Binding of private attributes: nqp::bindattr vs :=

I'm trying to find how the binding operation works on attributes and what makes it so different from nqp::bindattr. Consider the following example:

It prints:

$["a", "b", "c"]

Replacing nqp::bindattr with the binding operator from the comment gives correct output:

["a", "b", "c"]

Similarly, if foo is a public attribute and accessor is used the output would be correct too due to deconterisation taking place within the accessor.

I use similar code in my AttrX::Mooish module where use of := would overcomplicate the implementation. So far, nqp::bindattr did the good job for me until the above problem arised.

I tried tracing down Rakudo's internals looking for := implementation but without any success so far. I would ask here either for an advise as to how to simulate the operator or where in the source to look for its implementation.

0 投票
1 回答
116 浏览

raku - 在不显式导出的情况下获取模块的 Pod

Perl 6 程序中的文档,使用 Pod 6 DSL,实际上被解析为代码的一部分;这使得该文档在程序内部作为$=pod变量可用。但是,我想访问该变量,以便从测试中处理它。在我为 Perl 6 Advent Calendar 编写的这个例子中,它被简单地导出为一个类(在这种情况下是语法)变量:

然后我可以这样使用它:

这在使用类名和正确路径调用时有效;但它仍然需要变量的显式导出。

我在一些代码中看到可以使用 precomp 存储(抱歉,没有好的单一来源来解释这些)用于相同的事情。最终,这条线

诀窍是访问一个模块的 Pod,该模块由 precomp 存储表示并包含在$handle.unit. 问题是这实际上是较低级别,使用 NQP 的nqp::atkey运算符,而不是 perl

有很多方法可以做到这一点,所以我可以想到两个不同的可能问题。1. 有没有办法通过 FQN(前面是 ::)访问required 或used 单元的 Pod?2. 我们是否可以访问required 或used 单元的 precomp 句柄以便我们可以nqp::atkey直接调用?

0 投票
1 回答
152 浏览

abstract-syntax-tree - 从另一个程序获取 Perl 6 文件的 QAST

这与访问POD 的这个问题有关,但它比这更进一步。您可以使用以下命令轻松访问 Perl 6 程序的抽象语法树

这将打印整个 Q 抽象语法树。目前还不太清楚如何从您自己的程序中制作这个,或者我还没有找到如何做到这一点。实际上,CoreHackers::Q模块将其作为外部脚本运行。但是能够从您自己的程序中访问它,例如

会很好。我很确定这应该是可能的,在 NQP 级别并且可能以 Rakudo 依赖的方式。有人知道它很热吗?

0 投票
0 回答
94 浏览

oop - 内省 NQP 角色

StackOverflow 中的这个问题中,我发现了Type.^roles,其中包括组成一个类型的所有角色。它在所有地方都有效,但如果某处有 NQP 角色,它就无法打印:

没有方法gistStr. 但是,^name似乎有效:

我可以假设 NQP 角色遵循与 Perl 6 相同的元模型,并且我至少可以使用^name? 是否有更通用的打印所有角色的方法,包括 Perl 6 和 NQP 角色?

0 投票
1 回答
156 浏览

raku - 重新编译 nqp 后`缺少或错误的依赖版本`

我正在尝试学习如何调试rakudonqp。所以这是我的第一次尝试:

最后一个命令现在给出以下异常:

所以我想,也许我还需要make在 rakudo 上运行:

但这里make失败了:

0 投票
1 回答
113 浏览

raku - .nqp 文件中的 `nqp::if` 和 `if` 有什么区别?

来自World.nqp,第 3602 行

而来自World.nqp,第 3314 行

我认为if(不带nqp::)的最后一种形式是不允许的,除非if是内置的?请参阅NQP 内置子列表

第一种形式,nqp::if,在NQP Opcode List中有描述,但是我找不到第二种形式的文档,尽管它似乎是 Rakudo 源代码树中最常见的形式。

if为什么NQP中有两种形式的语句?

0 投票
1 回答
82 浏览

raku - 如何区分 nqp 迭代器的类型

在 nqp 中,您可以在 nqp 哈希或 nqp 列表上创建迭代器。我希望能够找出给定的 nqp 迭代器是否正在迭代哈希或列表。唉,我还没有找到办法做到这一点。他们甚至似乎拥有相同的名字:

这样的 nqp 迭代器似乎自己知道它是什么类型:

欢迎提出建议!