型宣言原理主義なTypeScript

TypeScriptの本を読もうとすると、2~3ページで飽きてしまい、なかなか読み切れない。
と云うのも、
LETとかSETとかANYとか

MS-BASIC調な用語

が出てくると、読む気がしなくない点がとても大きい。
そんな訳で、どれくらい面白くないのかブログに書いてみることにした。
すると・・・
不思議なことに
気持ちがカチっと音を立てて切り替わり
スルスルと本が読める様になる。(大笑)
散々黎明期のMMORPG(昔はひどかった!)をブログのネタにした後遺症かな?
・・・閑話休題・・・
さて、
誰が考えたのか判らないけど、
変数宣言をBNF風に書いていると
(”LET”|”VAR”)変数名[(“:”|”AS”) 型名][”=” 初期値]”;”
※(…)はブロック、x|yは論理和、[…]はオプション(書かなくても無くてもOK)
の様な感じになっている。
「楽に文法解析できる様にしてみました」
になっている。
LET 変数名   :型名  =初期値;
と書いて見せた方が親切だと思うのだが
LET 変数名:型名=初期値;
とした方がカッコいい(≒今風な)のだろう。
:を使うのは、
LET ~ AS ~ 風にしたら、
BASIC!世紀末を越えて墓から生還か?と、速攻で叩かれると恐れたんだろう。
ASはVisual Basicになってからかな?
あ、Visual Basicの変数宣言のDimってとっても意味不明だよね?(笑)
さて文法をケース毎に分けてみると

  1. 変数だけ宣言する場合
    • LET 変数名;
  2. 変数と型を宣言する場合
    • LET 変数名:型名;
  3.  変数と初期値を宣言する場合
    • LET 変数名=初期値;
  4.  変数と型と初期値を宣言する場合
    • LET 変数名:型名=初期値;

と、場合によって「:」があったりなかったりと、
事前に先のBNF風の文法でも一読して、
:の後は型名
=の後は初期値
と予習して

  • LET 変数名:  型名;

は、実は

  • LET 変数名  :型名;

なのだと見抜く必要がある。
※というか、記号で切り分ける文法ってかなり(/ω\)な気がする
また、TypeScriptをパパっとコンパイル(というよりコンバート?)してJavaScriptになるせいか
var を使うとJavaScriptと同様に{…}の中で変数宣言してもブロックの外に出ても使えることを許容しているものの
var   でもletでも同じ変数を複数宣言するのは絶対に認めたくなかったらしい。
しかし、
varやletの代わりにconst を使ったら定数の宣言文になるのは
「楽に文法解析できる様にしてみました」調のままだが、コレはマシな気がする。
ところが、初期値を配列やリストで宣言しようとすると、
「お気楽に文法を設計してみました」調が暴発する。
Let  msLanguage:    Array < string > = [‘TypeScript’,  ‘JScript’, ‘VBScript’, ‘VBA’,’N88-BASIC’];
と仰々しい。
Let  msLanguage:    [ string ] = [‘TypeScript’,  ‘JScript’, ‘VBScript’, ‘VBA’,’N88-BASIC’];
と書いたらもっと酷いかもしれないけど、まだ見やすい気がする。
※これで正しいのかな?
しかし、その思いを他所に
リストではその斜め上を逝っていて、
Let   listup: { [name: string]: string; } = {  ’ ya’ : ‘ ヤッ’, ‘ soft’: ‘柔らかい’, ‘ big’: ”大き目の’ ,   bank’:’堤防’, ‘hoo’ : ‘ホォ~’ , robe’:’ローブ’ };
で、
一目見るなり、

型宣言なんてメンドクサイ!

というのが多数決で即決しそうである。
そんな感じで
変数宣言ですら

サンプルソースを見たダケでは、とっつきにくいもの

になっている。
運悪く人生初めてのコンピュータ言語がこんなのだったら・・・
他の言語のソースをみた途端、

なんで変数名の後に「:」という区切り文字が無いんだ!

という感じに、速攻でアレルギー反応を起こすだろう。
また、型宣言原理主義に走っている箇所もある。
オブジェクト型変数にオブジェクトを入れずに空っぽのままの状態はnull値であるとすることが多いと思うが、
そこはAnyとすることが正しいのであ~るな調子の型宣言原理主義で出来ているので、
Let name:    String  | null;
で妥協しなければいけない。
※今はstrictを指定した場合だけみたいだけど、そのうちデフォでしょうね
JavaScriptでは、よく使うundefineも
Let name:    String  | undefine;
としておかないと、オブジェトの名前を書き間違えて参照すると、気が付けば不思議なエラーを吐いてしまう様になってしまうでしょうね。
しかし、
簡易な文例はともかく、
実際に使いだすと
enum EnumBuildType  {
firstBuild,
secondBuild,
thirdBuild,

LastBuild
}
let    buildNumber :   EnumBuildType = EnumBuildType .firstBuild;
の様にenumとの相性がとっても良かったりする。
 
総じて、
中途半端感が否めないのが
TypeScript(型スクリプト)
である。

所感

型無しスクリプトに型宣言を付けたら、
enumや共用型で試してみたら以外と使いやすい。^ ^ b
これって?普通のコンピュータ言語として使えるんじゃねぇ?と思ったら、
型宣言の語調と型無しの語調の歩調が狂いっぱなしでゴッチャゴチャになっちゃった(´;ω;`)
な感じがした。
率直に云えば、「俺様スクリプトの没原稿」みたいなシロモノ。
ま、大企業は予算とスケジュールの厳守が最優先だから致し方無いのだけれど
決められた予算とスケジュールを守って作ったら、こうなってしまったのだろうと思う。
10年も構想を錬ればもっとマシなものになったんじゃないのかな?
こんなもん出すくらいなら、
全く違う言語の文法で書いて、トランスレータを通したら
一般的なJavaScriptのソースが出力された方が数段マシな気がしました。
Node.jsで、逐一イベントの同期をとりながら処理するもの(バッチ的なもの)を書くのがとっても面倒だったりするので
それこそ、ストリーム調でもいいから

File  file = new File("./sample/data.txt");
file.read()
.readLine(lineData As String) {
  log(  (++lineNumbet)   + ":" + lineData);
}
.success(allData as String) {
  log("ファイルを読みました。\n" + allData) ;
  log("削除しますね。");
  file.remove();
}
.error(e as Exception) {
  log("異常事態発生:" + e ") ;
}
.finaly {
  …
  log("状況終了") ;
  file = null;
};

な様に何となくベタっぽいのが書けるほうがいいな。
それこそ
VB風の方がいいかもしれない。

Procedure File.Read(fileName As String)
  Event readLine(lineData As String)
   log(  (++lineNumbet)   + ":" + lineData)
  End Event
  Event success(allData as String)
    log("ファイルを読みました。\n" + allData) ;
    log("削除しますね。");
    file.remove();
  End Event
  Event error(e as Exception)
    log("異常事態発生:" + e ") ;
  End Event
  Finaly()
    log("状況終了") ;
    file = null;
  End Finaly
End Procedure
'--
Let  file :File = new File("./sample/data.txt")
file.read

グチ・モードのおかげで
本の40%(位置:684/1713 「行」 )まで読み進めることができた。
そのせいか、
書き始めの時ほどには、TypeScriptを悪く感じなくなってきた。
最後まで読めたら・・・
普通のコンピュータ言語のような気がしてくるのかもしれない。
ソースコードは
SyntaxHighlighter Evolved プラグインを使っています。
WP SyntaxHighlighterなどを使用すると<pre&rt;だけ効いてCSSが不発になってしまいます。
ドンとお祓い。




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA