我正在考虑使用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()
。我想不出一个合理的好语法。有什么想法吗?
答案 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
。但如果那真的是你想要的,请继续。