ECMAScript仕様輪読会 #25
前回: ECMAScript仕様輪読会 #24
Scrapboxの招待リンク: https://scrapbox.io/projects/esspec/invitations/85b96c9fa718ce5185e307196ed8fb53
connpass: https://esspec.connpass.com/
Discord: https://discord.gg/59S3y6weQj
Twitter hashtag: #esspec
便利ツール
esspec-memo: https://tars0x9752.github.io/esspec-memo/esspec.html
Scrapbox Codeblock Generator: https://vzvu3k6k.github.io/scrapbox-codeblock/
TC39 Terminology: https://github.com/tc39/how-we-work/blob/main/terminology.md
自己紹介 (近況報告)
syumai
Twitter: https://twitter.com/__syumai GitHub: https://github.com/syumai
ThinkPad X1 Nanoを買いました
SSDがM.2 2242 ? というやつで、差し替え用のやつを探すのが難しかった
Windowsを消したいので、Ubuntuをクリーンインストール出来るSSDが欲しかった
12月からドラム教室に通い始めました
Jun Yasumura / harupiyo Jun Yasumura.icon
英語のcanonical(https://ejje.weblio.jp/content/canonical 正典の、教会法に基づく、規準的な、標準的な )が、どうしても音楽のカノン(輪唱するやつ)のイメージに引きずられてしまう→音楽のカノンも実は教会法に基づく規範の、という意味だった→納得感
tars0x9752 (たーず / naoki aoyama) tars0x9752.icon
JSConf の otsu deshita
スノーボードが趣味なのでそろそろシーズンインが楽しみ
ウェアとかをかった
猪苗代スキー場というところが無料の会員登録すると平日リフト券無料 & 休日半額らしい
yebis0942yebis0942.icon
LT@JSConf.jp
https://jsconf.jp/2022/talk/seeking-technology-to-make-ecmascript-specifications-readable-to-everyone
https://vzvu3k6k.github.io/ecmakeup/
noyannoyan.icon
JSConf.jpがおわりました
syumaiさんを深夜に呼び出したり、yebisさんに順番を交代してもらったり迷惑をかけっぱなしでした。改めてありがとうございます!
来年はきちんとした発表をしたい
Reactを改めて頑張るぞ!という気持ちに
white-azalea
新規参入です。
2年前から Salesforce 系エンジニアやってます(それ以前は下請け系SIerでした)
普段使いは 私的には Python 仕事だと es, Apex 等。
貯蓄と投資/コードを書くのが趣味
小ネタ
ESMeta
TC39 Terminology
前回のあらすじ
Runtime Semantics: ClassDefinitionEvaluation
https://tc39.es/ecma262/#sec-runtime-semantics-classdefinitionevaluation
以下のコードをESMetaで実行して読んでいく。
code:js
class A {
constructor() {
this.p = 1;
}
hello() {
return "hello";
}
}
ScriptEvaluation
Let scriptContextbe a new ECMAScript code execution context.
abstract operationじゃないんだー
"a new ECMAScript code execution context"は他の箇所でも使われている
Completion abstract operation
GlobalDeclarationInstantiation
1. Let lexNames be the LexicallyDeclaredNames of script.
yebis0942.iconここからSTEPすると、今のソースコードがどのSDOに対応するかまで表示してくれて便利すぎる
今回はおそらくClassStaticBlockStatementList : StatementList
LexicallyDeclaredNames
HoistableDeclarationという非終端記号があった
Function か Generator およびそれの async のやつだけが HoistableDeclaration に該当
note: ここで返しているListは?→ECMAScript specification typeのlist(«»のリスト)
→ クラス名 A だけのリスト « A » が lexNames
VarDeclaredNames
→ HoistableDeclaration がないので empty list
lexNames を for each
ここではクラス名の A だけ
env.hasRestrictedGlobalProperty(name) が true なら sytnax error
→ global object のpropertyに生えている名前と被ってるかどうかみたいな
hasRestrictedGlobal のハナシ関連↓
code:js
class NaN {}
// VM38:1 Uncaught SyntaxError: Identifier 'NaN' has already been declared
{
class NaN{}
}
// undefined
{
class NaN{}
const n = new NaN();
console.log(n);
}
// NaN {}
code:js
var a = 1; var a = 1;
undefined
let a = 1; let a = 1;
let a = 1; let a = 1;
^
Uncaught SyntaxError: Identifier 'a' has already been declared
varNames を for each
今回は中身空なので何も起こらず
VarScopedDeclarations of script の結果を varDeclarations という名前に
empty list
abnormal terminations
abrupt completion的なもの?例外?
プログラムの異常終了みたいなものを考えましたが、classの文脈でこれに言及しなさそうですね
proxyに言及しているということは例外なのかなという気がしますねyebis0942.icon
Step 12: -> Annex B.3.2.2
ステップ実行してみたらそのまま素通りされてしまった
LexicallyScopedDeclarations of script の結果を lexDeclarations とする
ここで class A の定義まるっとが lexDeclarations になる
lexDeclarations を for each
lexDeclaration の name dn に対して env.CreateMutableBinding(dn, false)
unused を return
Runtime Semantics: Evaluation
「実行します!」というだけの文章だった
実体はいろいろなところのRuntime Semanticsに散らばっている
英語メモ
pieceWise: 区分的
意味としては、全区間の定義を一度におこなわず、区間ごとに担当するproductionがあることを指していそう?
pieceWiseの使用例では、複数のproductionが羅列されていることがおおい
CreateImmutableBindingになるのはどんな場合?
code:js
const A = class X {};
そもそもclass定義でCreateMutableBindingになるってどういうこと?
→classと同じ名前の変数に再代入できるので確かにmutableだと分かった!
code:【実験】定義したclassと同じ名前の変数に再代入できた.js
{
class A {
constructor() {
this.p = 1;
}
hello() {
return "hello";
}
}
A = 1;
console.log(A);
}
code:【実験2】constにclassを代入すると再代入できない.js
{
const A = class {
constructor() {
this.p = 1;
}
hello() {
return "hello";
}
}
A = 1;
console.log(A);
}
// Uncaught TypeError: Assignment to constant variable.
code:【番外】functionDeclarationで再代入.js
{
function F() {}
F = 1;
console.log(F);
}
// VM846:4 1
BoundNamesが複数になるケース
おそらくObjectBindingPatternとかがそれなのではyebis0942.icon
code:js
const { toString, valueOf } = new Object();
code:js
// 後で見たい
var c = class {}; // これがdeclaredFuncNames に入るか?
var f = function() {}; // これがdeclaredFuncNames に入るか?
次回予定
12/20 (火)(通常通り2週後)
来年は1週目スキップするかも