如何区分 nqp 迭代器的类型

How to tell the difference between types of nqp iterators

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

欢迎提出建议!

我认为你目前无法达到 nqp 级别,除非像你那样做:

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

就是说,我对 nqp 和 nqp::hash 的了解还不够,无法弄清楚如何让 iterkey_s 实际工作。


根据我的调查,NQP 基本上没有 API nqp::iterator 除了使用它。它只是 maps its iterator op to the underlying VM.


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

假设可以这样写:

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

然后布局 class 使其对应于 the VMIter struct defined in MoarVM.

然后,假设可以做到,并且 class 可以映射到 MoarVM 生成的实际结构,那么 P6 代码可以读取嵌入式 MVMIterBody 结构中的 the hash vs array mode .

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

相反,应该有一个明智的 API 允许 nqp iterators 以一种可以在 nqp 代码中使用的方式区分哈希和数组。我相信这就是你想要的。探索 nqp 来源和提交,文档表明它目前不存在。

(还有一个想法远未结束。如果有一天有 is repr 变体也可以映射到其他底层 VM(如节点或 JVM)的本机内存布局怎么办?这是否有意义?未来十年的某个时候?也许吧?)