在nqp中,您可以在nqp哈希或nqp列表上创建迭代器。我希望能够找出给定的nqp迭代器是否在哈希或列表上进行迭代。 las,我还没有找到一种方法。他们甚至似乎都有相同的名字:
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)
欢迎提出建议!
答案 0 :(得分:4)
我认为您目前无法在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代码可以读取嵌入的MVMIterBody
结构中的the hash vs array mode。
如果可以做到,甚至可以预见,那么我也许需要强调,人们不应该像我刚刚描述的那样疯狂地疯狂地戳戳东西。
相反,应该有一个明智的API,该API允许nqp iterator
能够以可在nqp代码中使用的方式区分哈希和数组。我确定那就是你想要的。浏览nqp的源代码,提交和文档表明目前尚不存在。
(远处的一个封闭者认为。如果有一天有is repr
个变化也可以映射到其他基础虚拟机(如节点或JVM)的本机内存布局,那该怎么办?甚至有意义吗?下一个十年?也许?)