如何分辨nqp迭代器类型之间的区别

时间:2019-03-18 15:07:34

标签: perl6 nqp

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

欢迎提出建议!

1 个答案:

答案 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)的本机内存布局,那该怎么办?甚至有意义吗?下一个十年?也许?)