为新的编程语言设计迭代器

时间:2013-01-01 00:22:49

标签: lambda programming-languages closures return

我正在考虑使用each()方法在编程语言中进行迭代的各种方法。我提出了“带收益的内联函数”的以下概念。它的目的是避免使用非局部返回的闭包,我也称之为块lambdas。示例伪代码后面有解释:

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被调用站点上的缩进代码块替换,而“yielding”表达式{在示例中,{1}}也作为变量传递给该缩进代码块。实际上,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()返回,或从each()返回。

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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