◆ 実態は関数でデコレータする関数(通常の/generator/async/class/method) をラップするだけでよかった
◆ ただの関数じゃなくて async 関数みたいな別物になってそう
  ◆ インポート時の名前に @ が含まれてる
  ◆ 専用の定義っぽい構文があって decorator キーワードができてる
◆ サンプルコードを見たときの嫌悪感がひどくてちゃんと説明文を読んでないので コードから分かる部分以外は間違ってるかも

デコレータのプロポーザルです

Stage1 のころ
現行の Stage2

まだ Stage2 なので確定ではないですが大きくは変わらない気がします

長いので流し見ですが見てみるとなんか思っていたものとは全然違いました
変に複雑になっていて 個人的には入らないでほしい機能です

期待していたもの

期待してたものは凄くシンプルで

@func
function a(){
return 1
}



a = func(function(){
return 1
})

になるもの

単純にデコレータの次の関数をラップするだけのものです
それだけでいいんです
これを関数やクラスやメソッドにできるだけで十分です
というかそれがほしいです

実際のもの

関数はできなくてクラスとプロパティのみらしいです
関数にほしいのに

Stage1 の Desugaring を見ると概ねイメージと近いです
このままならよかったのに

メソッドの場合は少し特殊で getOwnPropertyDescriptor や defineProperty がありますが defineProperty で上書き不可とか設定できたりするくらいでそこまで違うものではないです

それが Stage2 の方ではビルトインデコレータなんてものが登場してたり インポート時の関数名に @ が含まれていたり 「decorator」 というキーワードまで出てきてデコレータがただの関数は違う特殊なものになってる感じです
テンプレートストリングのタグみたく 特殊なフォーマットの引数を受け取るくらいにしてあくまでただの関数であってほしいのに
なんか全然違うよくわからないものになってしまってます
async 関数みたいな関数だけど関数とは少し違う亜種でしょうか

ちゃんと読んでないので経緯とかはわかりませんが よくやりたい readonly みたいなものを@decorator.readonly みたいに長くしたくなくて @readonly だけで書きたいけどグローバル変数にいろいろ増えてしまうし シンプルな名前だと通常関数とデコレータで区別しにくいから @ つけた別物にしようとなったのかと想像してます
ビルトインモジュールの 「std:***」 をインポートする機能も実装されてるので std:decorator からインポートでいいと思いますけどね


嫌な機能は自分は使わなければいい で済めばいいのですが コードの場合は他人の書いたものを読むことのほうが多いので 結局いらないものでも理解する必要あるから面倒なんですよね
async/await みたいな既存では辛い部分を大きく改善できるものならともかく そうじゃないものは変に複雑なことにせず単純な機能だけにしておいてほしいものです