4

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

use nqp;
dd nqp::iterator(nqp::hash).^name;  # BOOTIter
dd nqp::iterator(nqp::list).^name;  # BOOTiter

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

use nqp;
nqp::iterkey_s(nqp::iterator(nqp::list));
# This is not a hash iterator, it's a VMIter (BOOTIter)

欢迎提出建议!

4

1 回答 1

4

我不认为你现在可以在 nqp 级别,除非按照你所做的那样做:

use nqp;
nqp::iterkey_s(nqp::iterator(...));
CATCH {
  when /'not a hash'/ { say 'list?' }
  default             { say 'hash?' }
}

也就是说,我对 nqp 知之甚少,nqp::hash尤其是不知道如何开始iterkey_s实际工作。


根据我的调查,NQPnqp::iterator除了使用它之外基本上没有 API。它只是将其 op 映射iterator到底层 VM


以下不是建议。我可以说这主要是为了同情你的困境并鼓励每个人看到托管异常的纯粹简单和美丽,但如果有人潜入 MoarVM 的胆量来实施一个可能适用于 MoarVM 的可怕黑客,这也是一个疯狂的想法(不)幸运。

假设可以写:

class VMIter is repr('VMIter') { ... }

然后对类进行布局,使其与MoarVM 中定义VMIter结构相对应。

然后,假设可以做到,并且类可以映射到 MoarVM 生成的实际结构,那么 P6 代码可以读取嵌入式结构中的哈希与数组模式。MVMIterBody

如果可以做到,或者甚至考虑过,那么也许我需要强调人们不应该像我刚才描述的那样做疯狂的非便携式胆量戳东西。

相反,应该有一个合理的 API 允许 nqpiterator以可以在 nqp 代码中使用的方式区分散列和数组。我确定这就是你想要的。探索 nqp 来源和提交和文档表明它目前不存在。

(还有一个很遥远的想法。如果有一天有一些is repr变化也可以映射到其他底层虚拟机(如 node 或 JVM)的本机内存布局呢?这是否有意义?在未来十年的某个时候?也许?)

于 2019-03-18T17:20:45.303 回答