【问题标题】:How to tell the difference between types of nqp iterators如何区分 nqp 迭代器的类型
【发布时间】:2019-03-18 15:07:34
【问题描述】:

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

欢迎提出建议!

【问题讨论】:

    标签: raku nqp


    【解决方案1】:

    我认为你目前不能在 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 的胆量实施一个可怕的 hack 可能也是一个疯狂的想法如果他们(不)幸运的话,可以在 MoarVM 上工作。

    假设有人可以这样写:

    class VMIter is repr('VMIter') { ... }
    

    然后对类进行布局,使其对应于the VMIter struct defined in MoarVM

    然后,假设可以做到,并且类可以映射到 MoarVM 生成的实际结构,那么 P6 代码可以读取嵌入的 MVMIterBody 结构中的 the hash vs array mode

    如果可以做到,或者甚至考虑过,那么也许我需要强调人们不应该像我刚才描述的那样做疯狂的非便携式胆量戳东西。

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

    (还有一个很遥远的想法。如果有一天有is repr 变体也可以映射到其他底层虚拟机(如节点或JVM)的本机内存布局呢?这是否有意义?下一次的某个时候十年?也许吧?)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      • 1970-01-01
      • 2019-04-21
      • 1970-01-01
      相关资源
      最近更新 更多