聞いたこともないソフトウェアのイディオム

イベントのシーケンスは次のとおりです。



納屋から熊手を取り出し、庭で葉を熊手し、そして熊手を納屋に戻します。



シアトルに飛んで、観光スポットを見て、家に帰ります。



キーをドアに挿入して開き、ドアからキーを取り外します。



電話の画面をオンにし、時刻を確認してからオフにします。



パターンが見えますか? 何かをしてから、別のことをしてから、最初のアクションをキャンセルします。 または、より正確には、最後のステップは最初のステップの逆です。 このテンプレートについて知っていれば、どこにでも表示されます。 マグカップを取り、コーヒーを飲み、マグカップを置きます。 同じことはコードでも一般的です。



ファイルを開き、内容を読み取り、ファイルを閉じます。



メモリブロックを割り当て、何かに使用し、メモリを解放します。



メモリセルの内容をレジスタにロードし、変更して、メモリに送り返します。



説明と例を挙げるのは簡単ですが、実践するのは簡単ではありません。 上の例の "open file ..."をイディオム(Open、Read)として書き込めるように、イディオム(Function1、Function2)のような操作が必要です。 困難なのは、「開く」の逆要素が「閉じる」ことを決定する何らかのソフトウェアの方法が必要なことです。 関数に反転が存在するプログラミング言語はありますか?



驚くべきことに、 Jがあります そして、私が話しているこのイディオムは、と呼ばれるJの関数として組み込まれています。 つまり、ロシア語であり、Jの簡潔な構文ではなく、ファイルを開く例は「開いた状態で読む」ように聞こえます。



Jのunderの非自明な使用法の1つは、ベクトルのモジュラスを計算することです。 簡単なアルゴリズムを次に示します。各項を平方し、それらを追加してから、結果の平方根を抽出します。 うーん... 3番目のステップは最初のステップの逆です。 正方形の下に追加。 または、実際のJコードでは:



mag =: +/&.:*:
      
      





+/



-これは追加です。 シーケンス&、ピリオド、コロンはのの関数を意味し、 *:



は二乗します。



他の一部のプログラミング言語には、 アンダー関数に特有の類似物があります。 たとえば、Rubyでは、このファイルに対して必要なアクションを含むファイルを開くことができ、指定されたアクションが終了すると自動的に閉じます。



 File.open('file.txt', 'w') {|file| #   «file.txt»   («w» — write) file.puts 'Wrote some text.' }
      
      






All Articles