在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基本上没有nqp::iterator
的API。它只是maps its iterator
op to the underlying VM。
以下不是建议。我可以说这主要是为了同情你的困境,并鼓励每个人都看到管理异常的纯粹简洁和美丽,但这也是一个疯狂的想法,有人潜入MoarVM的胆量实施可能在MoarVM上工作的可怕的黑客(如果他们是的话)联合国)幸运。
假设有人可以写:
class VMIter is repr('VMIter') { ... }
然后布局类,使其对应于the VMIter
struct defined in MoarVM。
然后,假设可以完成,并且类可以映射到MoarVM生成的实际结构,那么P6代码可以读取嵌入的the hash vs array mode结构中的MVMIterBody
。
如果可以做到,或者甚至考虑到,那么也许我需要强调的是,民众不应该像我刚才描述的那样做疯狂的非便携式内容。
相反,应该有一个合理的API,允许nqp iterator
s以可以在nqp代码中使用的方式区分哈希和数组。我确定这就是你想要的。探索nqp源代码,提交和文档表明它目前还不存在。
(并且有一个关闭远远的想法。如果有一天有is repr
变体也可以映射到其他底层虚拟机(如节点或JVM)的本机内存布局?这甚至有意义吗?在未来十年的某个时候?也许?)