Perl 6の語彙変数

プログラミングの問題の1つは、ボリュームが大きくなるにつれてプログラムの複雑さが増すという問題です。 歴史的には、相互作用が制限されているプログラムの特定の部分を分離することで解決されています。 このアプローチは、プログラミングのすべてのレベルで機能します-「概念の分離」、「1つのことを実行し、適切に実行する」、BCNF、モナド、プロシージャ、クラス、ロール、モジュール。 それらはすべて、組み合わせ論と戦わないように、プログラムの一部の制限を奨励しています。 論理的な分離の最も単純な例は、字句変数です。

{ my $var; # $var   } # $var    


これについて何が面白いですか?

当初から、Perlはこれを間違っていました。 デフォルトでは、Perl 5の変数のスコープはモジュール変数であり、グローバル変数のようなものです。 ブロック内で何かを定義すると、外部から見えるようになります。

 $ perl -v This is perl 5, version 12, subversion 1 (v5.12.1) $ perl -E '{ $var = 42 }; say $var' 42 $ perl -wE '{ my $var= 42 }; say $var' Name "main::var" used only once: possible typo at -e line 1. Use of uninitialized value $var in say at -e line 1. 


Perl 6では、デフォルトで字句変数が機能します。

 $ perl6 -e '{ $var = 42 }; say $var' #    'my' ===SORRY!=== Symbol '$var' not predeclared in <anonymous> $ perl6 -e '{ my $var = 42 }; say $var' #    –    ===SORRY!=== Symbol '$var' not predeclared in <anonymous> 


まあ、それはタイプミスをキャッチするのに役立つかもしれません...しかし、これの主な利点は、変数の正直な範囲で作業することです。 これにより、プログラムの複雑さを管理できます。

もちろん、Perl 5は「正しく」プログラムすることを強制せず、厳格な警告を使用しませんでした。 Perl 5は後方互換性を提供することを約束しましたが、Perl 1は明らかに複雑なプログラムを書くことを意図していませんでした。 小さなスクリプトのグローバル変数は理にかなっています。

Perl 6は、小規模な作業を開始し、プログラムの成長に合わせて構造化されたサポートを追加しようとしています。 変数の場合、これは、スクリプトとモジュールではデフォルトで変数が字句であることを意味しますが、–eで呼び出される単一行のファイルでは、グローバル変数が残ります。

レキシカル変数についてのすべてがそうではないと思ったら。 このアプローチには予期しないボーナスがあります。 機能を考えてみましょう:

 sub counter($start_value) { my $count = $start_value; return { $count++ }; } 


コードブロックが返されます。 カウンターが呼び出されるたびに、何度も呼び出すことができるコードを取得します。

このコードの2つの異なる部分を作成し、それらを操作すると、次のようになります。

 my $c1 = counter(5); say $c1(); # 5 say $c1(); # 6 my $c2 = counter(42); say $c2(); # 42 say $c1(); # 7 say $c2(); # 43 


ほら $ c1と$ c2は独立して機能します。 各状態は、変数$ countの形式で保存されます。 私たちにとっては、1つの変数のように見えるかもしれませんが、2つの異なるカウンターインスタンスの場合、これらは2つの異なる値のストレージエリアです。 このようなブロックはクロージャーと呼ばれます。

クロージャーが軽量オブジェクトに似ていると思われる場合-おめでとうございます、まさにそうです。 アクセス制限の本質は、TOEでの情報のカプセル化と非表示の本質と同じです。 プログラムの特定の部分ができる限り少なくできるように、これはすべて、アクティビティのフィールドを制限するために必要です。

Source: https://habr.com/ru/post/J253133/


All Articles