00. 対象たいしょうと設計せっけいの決定けってい
方針ほうしん
この仕様しようは、実装じっそうすべき言語げんごと操作そうさを、閉とじた契約けいやくcontractとして定義ていぎする。未実装みじっそうの機能きのうを、将来しょうらいの曖昧あいまいな判断はんだんに委ゆだねたまま、現在げんざいの成功せいこうする経路けいろへ置おいてはならない。拡張点かくちょうてんextension pointについても、入力にゅうりょく・出力しゅつりょく・失敗しっぱい・許可範囲きょかはんいを定義ていぎする。
1. 実装対象じっそうたいしょう
Grammarは、readerとprefix構造こうぞう、束縛そくばくbinding、表示分類ひょうじぶんるい、外部がいぶreaderの接続せつぞくを定義ていぎする。それらを検査済けんさずみのLanguagePackageへcompileする。
Docは、再帰的さいきてきな文書構造ぶんしょこうぞう、sentence literal、rubyとanno、sentence単位たんいのparallel、相互参照そうごさんしょう、数式すうしき・回路かいろ・コードの埋うめ込こみを保持ほじする。これらの構造こうぞうからHTMLを生成せいせいする。
Mathは、構造化こうぞうかした数学表現すうがくひょうげん、束縛そくばく、厳密げんみつな有理数ゆうりすうと配列はいれつの計算けいさん、MathML Coreへの出力しゅつりょくを扱あつかう。
Circuitは、二値にち・固定幅こていはば・同期どうき離散時間りさんじかんの階層回路かいそうかいろを宣言せんげんする。検査けんさ、elaboration、step、テスト、NOR IR、SVGへの出力しゅつりょくを扱あつかう。
完成品かんせいひんには、native CLI、wasm32-wasip2 CLI、browser worker用ようWasm、汎用はんようLSP server、portable operation providerを含ふくめる。
r3では、4言語げんごのWeb Playground、純粋じゅんすいTEA UI core、静的せいてきな文書ぶんしょ・例れい・Rust APIサイトと、GitHub Pagesでの配布はいふを含ふくめる。正式文書せいしきぶんしょを最終的さいしゅうてきにNEPL3 Doc DSLへ移行いこうする計画けいかくと、その受入うけいれも必須ひっすとする。現在げんざいのMarkdownは、移行審査いこうしんさが済すむまでは正本せいほんcanonical sourceである。未定義みていぎのDoc表現ひょうげんを、情報じょうほうを失うしなう変換へんかんやRawHtmlで埋うめてはならない。詳細しょうさいは14〜16章しょうに定さだめる。
汎用はんようNEPL3プログラミング言語げんご、動画どうがDSL、完全かんぜんなHTML処理系しょりけい、アナログまたは伝播遅延でんぱちえんを扱あつかう回路かいろ、CAS、証明器しょうめいき、独自どくじフォントrasterizerは、このパッケージの言語げんごには含ふくめない。これらの名前なまえでstubを提供ていきょうしてはならない。追加実装ついかじっそうは、登録済とうろくずみのschema・operation・readerの公開契約こうかいけいやくを通とおして行おこなう。MathML・HTML・SVGの出力しゅつりょくは、正式せいしきな出力しゅつりょくbackendである。後あとで捨すてる仮かりのrendererとして実装じっそうしてはならない。
2. 保存ほぞんする意味上いみじょうの境界きょうかい
arityは、headを識別しきべつした時点じてんで既知きちのschemaとcontextから確定かくていする。子この評価結果ひょうかけっかによって、親おやのarityを変更へんこうしてはならない。
listは、既知きちの
cons(arity 2)とnil(arity 0)を展開てんかいした構文こうぶんで表あらわす。listofはschema compilerのcombinatorであり、可変かへんarityを導入どうにゅうする抜ぬけ道みちではない。将来しょうらい、複数引数ふくすうひきすうの関数適用かんすうてきようを導入どうにゅうする言語げんごでは、binary applyを反復はんぷくする。今回こんかいのDSL constructorを、関数値かんすうちの適用てきようへ強制的きょうせいてきに変換へんかんしてはならない。
token内部ないぶreaderの木きと、共通きょうつうprefix構文木こうぶんぎは、別べつの構造こうぞうである。editor用ようのviewを公開こうかいしても、共通きょうつうparserの子この数かずは変かわらない。
Parsed、Resolved、Checked、Preparedを区別くべつする。すべての言語げんごへ、同おなじ必須ひっすpipelineを課かしてはならない。操作そうさごとの前提ぜんていは、各章かくしょうに記しるす。
意味値いみちだけから、元もとのsource表記ひょうきやsource spanを逆算ぎゃくさんしてはならない。
3. 試作しさくの扱あつかい
この設計せっけいのAPI・モデル・エラー・責務せきむを、後あとで交換こうかんする粗あらい仮設計かりせっけいとして実装じっそうしてはならない。後方互換こうほうごかんを維持いじするために、誤あやまった設計せっけいを保存ほぞんすることも要求ようきゅうしない。設計せっけいを変更へんこうするときは、新あたらしいdesign revisionを与あたえ、関連かんれんするすべての契約けいやくと試験しけんを同時どうじに更新こうしんする。
v1 は契約識別けいやくしきべつに用もちいるrevisionであり、将来しょうらいの無期限むきげんなABI互換ごかんを約束やくそくする呼称こしょうではない。
4. 不変条件ふへんじょうけん
INV01:prefixの境界きょうかいが一意いちいであること。
INV02:未知みちのarityを推測すいそくしないこと。
INV03:読よみ過すぎを禁止きんしすること。
INV04:source snapshotへの所属しょぞくを保持ほじすること。
INV05:source mappingを明示めいじすること。
INV06:domain-specific kindを使つかうこと。
INV07:値あたいの生成せいせいと実行対象じっこうたいしょうを区別くべつすること。
INV08:不正ふせいな構文こうぶんも保存ほぞんできること。
INV09:言語げんごcoreの依存関係いぞんかんけいをDAGにすること。
INV10:意味いみと操作そうさの契約けいやくをportableにすること。
INV11:failureを成功せいこうへ変かえないこと。
INV12:同おなじresource snapshotから決定的けっていてきな結果けっかを得えること。
INV13:sentenceの対応単位たいおうたんいを著者ちょしゃが指定していすること。
INV14:providerとworkspaceのtrustを区別くべつすること。
5. 具体的ぐたいてきな綴つづり
以前いぜんの会話かいわにあった Fn、value、splice は、今回こんかいの4言語げんごの組込くみこみではない。構文生成こうぶんせいせいは、各言語かくげんごの公開こうかいconstructor APIで実際じっさいに行おこなえる。将来しょうらいの言語げんごは、同おなじconstructor schemaを呼よび出だして実装じっそうする。Grammarの call / map / then は、現在げんざいもRust providerへ接続せつぞくできる完全かんぜんな拡張点かくちょうてんである。
各言語かくげんごの全ぜんconstructorとarityは design/forms.json に定さだめる。そこで定義ていぎされていない綴つづりは、該当がいとうカテゴリの明示的めいじてきな識別子しきべつしleaf規則きそくに一致いっちする場合ばあいだけ、名前参照なまえさんしょうとして読よめる。未知みちのformを、arity 0と推測すいそくしてはならない。