0

我正在考虑使用 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的,在调用站点被缩进代码块替换,并且iter.next()在示例中,“yielded”表达式也作为变量传递给该缩进代码块。实际上,代码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 from main()because中的 return 语句each()被内联到main(). 这避免了非本地返回关闭的复杂性。

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

4

2 回答 2

1

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

于 2013-01-01T00:40:25.090 回答
0

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

于 2013-01-01T00:40:20.977 回答