プログラミング言語で each() メソッドを繰り返し処理するさまざまな方法を検討しています。「yield 付きのインライン関数」という次のアイデアを思いつきました。その目的は、ブロック ラムダと呼ばれる非ローカル リターンによるクロージャを回避することです。疑似コードの例とその後の説明:
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()
、例の "yield" 式がそのインデントされたコード ブロックに変数として渡されることを意味します。実際には、コード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
、上部にある疑似コードの例で変数を設定する方法です。合理的で適切な構文が思い浮かびません。何か案は?