Lambda 为一种新的编程语言设计迭代器
我正在考虑在编程语言中使用each()方法进行迭代的各种方法。我提出了以下“带产量的内联函数”的想法。它的目的是避免具有非局部返回的闭包,我也看到了称为block lambdas的闭包。示例伪代码及其后面的解释: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
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)
似乎都是合乎逻辑的解决方案