【问题标题】:Designing iterators for a new programming language为新的编程语言设计迭代器
【发布时间】:2012-12-15 22:23:15
【问题描述】:

我正在考虑使用 each() 方法围绕编程语言进行迭代的各种方法。我提出了以下“带产量的内联函数”的想法。它的目的是避免带有非本地返回的闭包,我也见过这种闭包,称为块 lambda。示例伪代码,后面有解释:

class LinkedList
    iterator()
        # construct and return iterator

    inline each()
        iter = iterator()
        while iter.hasNext()
            yield iter.next()

main()
    list = LinkedList.new
    # add stuff to linked list

    list.each()
        # somehow the yield in each() populates v
        print v
        if v == "foo"
            return

inline 关键字表示 each() 调用在调用时是内联的,yield 在调用站点被缩进的代码块替换,而“yielded”表达式在示例中为 iter.next(),也作为变量传递给缩进的代码块。实际上,main() 的代码被转换为以下代码

main()
    list = LinkedList.new
    # add stuff to linked list

    # list.each() call transformed
    iter = list.iterator()
    while iter.hasNext()
        v = iter.next()
        print v
        if v == "foo"
            return

list.each() 之后的缩进代码块没有作为闭包传递给 each() 以执行。如果是这样,那么 return 语句的含义就会令人困惑。是从关闭返回,从each()返回,还是从main()返回。

main() 中的 return 语句从 main() 返回,因为 each() 被内联到 main() 的代码中。这避免了带有非本地返回的闭包的复杂性。

我遇到的问题是如何在顶部给出的示例伪代码中填充变量v。我想不出一个合理的好语法。有什么想法吗?

【问题讨论】:

    标签: lambda programming-languages closures return


    【解决方案1】:

    list.each(v) 似乎是合乎逻辑的解决方案

    【讨论】:

      【解决方案2】:

      您可以像任何其他语言的 for each 循环一样执行此操作。 Java 类似于for(fooType foo: fooList) proc;。 IIRC,Python 就像for foo in fooList: proc。 PostScript 转到fooList proc forall。这些构造中的每一个都遍历fooList,为fooList 中的每个foo 执行proc。除了 PostScript 之外,它们都获取fooList.iterator()fooList.__iter__(),然后使用it.next() 遍历其所有元素,检查是否通过使用it.hasNext() 或侦听StopIteration 异常来完成。如果您希望程序员通过定义 fooList.each() 方法而不是 fooList.iterator()(或其他)来定义该构造中的行为,请继续。我只是不确定为什么要将迭代器生成方法命名为each。但如果这真的是你想要的,那就去吧。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-12
        • 2010-11-15
        • 2014-04-24
        • 2011-06-11
        • 2014-04-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多