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

Lambda 为一种新的编程语言设计迭代器,lambda,programming-languages,closures,return,Lambda,Programming Languages,Closures,Return,我正在考虑在编程语言中使用each()方法进行迭代的各种方法。我提出了以下“带产量的内联函数”的想法。它的目的是避免具有非局部返回的闭包,我也看到了称为block lambdas的闭包。示例伪代码及其后面的解释: class LinkedList iterator() # construct and return iterator inline each() iter = iterator() while iter.hasNext

我正在考虑在编程语言中使用each()方法进行迭代的各种方法。我提出了以下“带产量的内联函数”的想法。它的目的是避免具有非局部返回的闭包,我也看到了称为block 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
在调用站点被缩进的代码块替换,并且“yield”表达式,
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
。我想不出一个好的语法是合理的。有什么想法吗?

你可以像其他任何语言的
一样,对每个
循环都这样做。Java类似于(fooType foo:傻瓜)proc的
。IIRC中,Python类似于愚人程序中foo的
。PostScript将成为所有程序的傻瓜程序
。这些构造中的每一个都在
doulist
中迭代,对
doulist
中的每个
foo
执行
proc
。除了PostScript one之外,它们都获取
doulist.iterator()
doulist.\uu iter\uuu()
,然后使用
it.next()
运行所有its元素,检查是否通过使用
it.hasNext()
或侦听
StopIteration
异常来完成。如果您希望程序员通过定义
doulist.each()
方法而不是
doulist.iterator()
(或其他任何方法)来定义该构造中的行为,请继续。我只是不知道为什么要将迭代器生成方法命名为
each
。但如果这真的是你想要的,那就继续吧。

列表。每个(v)
似乎都是合乎逻辑的解决方案