「esac
」は以前の「case
」を終了して「コードブロック」を形成します。
Algol68では、それらが使用されます。通常、エンクロージャーの終了には、導入キーワードの逆の文字シーケンスが使用されます。 ( if ~ then ~ else ~ fi, case ~ in ~ out ~ esac, for ~ while ~ do ~ od ).
Edsger Dijkstraと彼のGuarded Command Languageにちなんで「Guarded Blocks」と呼びます。
od
おそらく、UNIXの「od」コマンドがすでに存在していたため、Bourne Shellで使用されなかったと思われます。
歴史:
「保護されたブロック」のアイデアは、ALGOL 68から来たようです。 例:英語:
proc days in month = (int year, month)int:
case month in
31,
if year mod 4=0 ∧ year mod 100≠0 ∨ year mod 400=0 then 29 else 28 fi,
31, 30, 31, 30, 31, 31, 30, 31, 30, 31
esac;
ソビエトのAlgol68 LGU実装も同じことを行いました。英語ではAlgol68の敬reなcase文の読み取りcase ~ in ~ out ~ esac
、キリル文字ではこれが読み取りますвыб ~ в ~ либо ~ быв
。
その後、1975年に、Algol68のコードブロックがEdsger DijkstraのGuarded Command Languageのために借りられました。例えば
if a ≥ b → max := a
| b ≥ a → max := b
fi
おそらく、Dijstra は、Algol60で実装され、Cプログラミング言語で再設計されたDangling elseのあいまいさを克服するために、「Guarded Blocks」を使用したと考えられます。(shift-reduce conflictを参照してください。)
最後に、Algol68から-" esac
" ALGOL 68Cと呼ばれる初期のAlgol68コンパイラを開発したStephen R. Bourneの好意により、1977年のBourneシェル(あなたが発見した場所esac
)に入れました。
有名なスティーブンは、マクロと呼ばれる「Cヘッダーファイル」でこれらの同じ保護されたブロックも使用しました。
#define IF if(
#define THEN ){
#define ELSE } else {
#define ELIF } else if (
#define FI ;}
著名なソフトウェアの天才Landon Curt NollとLarry Basselは、1984年にナショナルセミコンダクターのGenixポーティンググループで働いていたスティーブのmacro.hコードに偶然出会い、そのアプリケーションの理解に苦労しました。そして、Landon&Larryはその後、国際難読化Cコードコンテストを作成しました...
1984年から今日まで、ダイクストラの保護されたコマンドを使用しない他の「より良い」プログラミング言語が数千ありました。Steven Bourneによるそれらの使用はmacro.h
、講義で眠っていなかった証拠としてIT学部生の「ソフトウェア開発学位論文」でしばしば引用されています。:-)
esac
正確に必要な場所のポイントのインデックスエントリ—定義し、必要であることを示す行へ。