如何区分nqp迭代器的类型

问题描述 投票:4回答:1

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

建议欢迎!

perl6 nqp
1个回答
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代码可以读取嵌入的the hash vs array mode结构中的MVMIterBody

如果可以做到,或者甚至考虑到,那么也许我需要强调的是,民众不应该像我刚才描述的那样做疯狂的非便携式内容。

相反,应该有一个合理的API,允许nqp iterators以可以在nqp代码中使用的方式区分哈希和数组。我确定这就是你想要的。探索nqp源代码,提交和文档表明它目前还不存在。

(并且有一个关闭远远的想法。如果有一天有is repr变体也可以映射到其他底层虚拟机(如节点或JVM)的本机内存布局?这甚至有意义吗?在未来十年的某个时候?也许?)

© www.soinside.com 2019 - 2024. All rights reserved.