我不认为你现在可以在 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)的本机内存布局呢?这是否有意义?在未来十年的某个时候?也许?)