我认为你目前不能在 nqp 级别上,除非按照你所做的那样做:
use nqp;
nqp::iterkey_s(nqp::iterator(...));
CATCH {
when /'not a hash'/ { say 'list?' }
default { say 'hash?' }
}
也就是说,我对 nqp 和 nqp::hash 的了解还不够,尤其是无法弄清楚如何让 iterkey_s 实际工作。
根据我的调查,NQP 基本上没有用于nqp::iterator 的 API,而只是使用它。它只是maps its iterator op to the underlying VM。
以下内容不是建议。我可以说这主要是为了同情你的困境并鼓励每个人看到托管异常的纯粹简单和美丽,但对于有人潜入 MoarVM 的胆量实施一个可怕的 hack 可能也是一个疯狂的想法如果他们(不)幸运的话,可以在 MoarVM 上工作。
假设有人可以这样写:
class VMIter is repr('VMIter') { ... }
然后对类进行布局,使其对应于the VMIter struct defined in MoarVM。
然后,假设可以做到,并且类可以映射到 MoarVM 生成的实际结构,那么 P6 代码可以读取嵌入的 MVMIterBody 结构中的 the hash vs array mode。
如果可以做到,或者甚至考虑过,那么也许我需要强调人们不应该像我刚才描述的那样做疯狂的非便携式胆量戳东西。
相反,应该有一个合理的 API 允许 nqp iterators 以可以在 nqp 代码中使用的方式区分散列和数组。我确定这就是你想要的。探索 nqp 来源和提交和文档表明它目前不存在。
(还有一个很遥远的想法。如果有一天有is repr 变体也可以映射到其他底层虚拟机(如节点或JVM)的本机内存布局呢?这是否有意义?下一次的某个时候十年?也许吧?)