ほとんどの高級言語でパイプ演算子が見られないのはなぜですか? 質問する

ほとんどの高級言語でパイプ演算子が見られないのはなぜですか? 質問する

Unixシェルプログラミングではパイプ演算子は非常に強力なツールです。コア ユーティリティの小さなセット、システム言語 (C など)、スクリプト言語 (Python など) を使用すると、オペレーティング システムによって自動的に並列化される、非常にコンパクトで強力なシェル スクリプトを作成できます。

これは明らかに非常に強力なプログラミング パラダイムですが、シェル スクリプト以外の言語でパイプが第一級の抽象化として使用されているのを見たことはありません。パイプを使用してスクリプトの機能を再現するために必要なコードは、常に非常に複雑であるように思われます。

そこで私の疑問は、なぜ C#、Java などの現代の高級言語に Unix パイプに似たものが見られないのかということです。ファーストクラスのパイプをサポートする言語 (シェル スクリプト以外) はありますか? 並行アルゴリズムを表現する便利で安全な方法ではないでしょうか?

誰かがそれを持ち出す場合に備えて、F# のパイプフォワード演算子 (フォワードパイプ演算子) を調べたところ、関数適用演算子のように見えました。私の知る限り、2 つのストリームを接続するのではなく、データに関数を適用しますが、修正は歓迎します。

追記: コルーチンの実装について調査しているときに、いくつかの類似点があることに気づきました。ブログ投稿Martin Wolf は、パイプではなくコルーチンの観点から、私と似た問題を説明しています。

ベストアンサー1

ハハ!Googleのおかげで、SOの回答興味があるかもしれません。基本的に、この答えは、ビット単位の OR 演算子をオーバーロードしてシェルのようなパイプを提供することで、「本当に必要な場合を除いて演算子をオーバーロードしない」という主張に反するもので、次のような Python コードになります。

for i in xrange(2,100) | sieve(2) | sieve(3) | sieve(5) | sieve(7):
    print i

概念的には、2 から 99 () までの数字のリストを、xrange(2, 100)指定された数の倍数 (最初に 2、次に 3、次に 5、最後に 7) を除去する sieve 関数にパイプします。これは素数ジェネレータの始まりですが、この方法で素数を生成するのはあまり良い考えではありません。しかし、もっと多くのことができます。

for i in xrange(2,100) | strify() | startswith(5):
    print i

これにより、範囲が生成され、すべてが数値から文字列に変換され、5 で始まらないものがすべて除外されます。

mapこの投稿では、 と の 2 つのメソッドをオーバーロードしてfilterパイプの動作を記述できる基本的な親クラスを示しています。 は メソッドをstrify()使用mapしてすべてを文字列に変換し、 はメソッドsieve()を使用してfilter数値の倍数でないものを除外します。

これは非常に巧妙な方法ですが、あまり Python らしくないかもしれません。しかし、あなたが求めているものと、おそらく他の言語にも簡単に適用できる、それを実現するためのテクニックを示しています。

おすすめ記事