0

プログラミング言語で 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、上部にある疑似コードの例で変数を設定する方法です。合理的で適切な構文が思い浮かびません。何か案は?

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. これらの構成のそれぞれは、 を反復処理し、それぞれに対してfooList実行します。PostScript を除いて、それらはすべてフェッチ または使用してすべての要素を実行し、例外を使用またはリッスンして実行されたかどうかを確認します。プログラマーが (または何でも)ではなくメソッドを定義することによって、その構造の動作を定義するようにしたい場合は、先に進んでください。イテレータ生成メソッドに名前を付けたい理由がわかりません。しかし、それが本当にあなたが望むものなら、先に進んでください。procfoofooListfooList.iterator()fooList.__iter__()it.next()it.hasNext()StopIterationfooList.each()fooList.iterator()each

于 2013-01-01T00:40:20.977 に答える