在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)欢迎提出建议!
发布于 2019-03-18 17:20:45
我不认为你现在可以在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基本上没有用于nqp::iterator的API。它只是操作到底层VM。。
下面是而不是的建议。我可以说,这主要是为了同情你的困境,鼓励每个人看到管理异常的简单性和美妙之处,但这也是一个疯狂的想法,有人潜入MoarVM的内脏实施可怕的黑客攻击,如果他们是(不)幸运的话,可能在MoarVM上工作。
假设一个人可以写:
class VMIter is repr('VMIter') { ... }然后对类进行布局,使其对应于在MoarVM中定义的结构。
然后,假设可以这样做,并且类可以映射到MoarVM生成的实际结构,那么P6代码可以在嵌入式MVMIterBody结构中读取散列模式与数组模式。
如果这是可以做到的,甚至是被考虑到的,那么也许我需要强调的是,人们不应该像我刚才描述的那样做疯狂的、不可携带的戳人的事情。
相反,应该有一个合理的API,允许nqp iterator以一种可以在nqp代码中使用的方式区分散列和数组。我相信这就是你想要的。查看nqp源代码并提交,doc建议目前还不存在。
(还有一个人走到很远的地方想。如果有一天有is repr变体也可以映射到其他底层JVM (如节点或JVM)的本地内存布局,该怎么办?这说得通吗?在下一个十年的某个时候?也许吧?)
https://stackoverflow.com/questions/55224407
复制相似问题