01. Repository・crate・依存方向いぞんほうこう

方針ほうしん

初期しょきrepositoryは NEPL3 のmonorepoとする。意味上いみじょう境界きょうかいとcrateの依存方向いぞんほうこうconsumerからdependencyへの一致いっちさせ、言語げんご出力しゅつりょくbackendを分離ぶんりする。crateの全一覧ぜんいちらんと、直接依存ちょくせついぞん許可集合きょかしゅうごうdesign/dependencies.jsonしるす。

1. 配置はいち

text
NEPL3/
  Cargo.toml
  Cargo.lock
  rust-toolchain.toml
  AGENTS.md
  doc/
    spec/
    decisions/
    history/
  design/
  interfaces/
  languages/
    grammar/ syntax.neplg package.ndf
    doc/     syntax.neplg package.ndf
    math/    syntax.neplg package.ndf
    circuit/ syntax.neplg package.ndf
  crates/
    foundation/
      core/src/       source/ schema/ value/ syntax/ origin/ diagnostic/ budget/
      reader/src/     plan/ combinator/ execution/ extension/
      engine/src/     parse/ binding/ index/ query/ recovery/
      wire/src/       cbor/ schema/ protocol/
    languages/
      grammar/core/src/ bootstrap/ model/ check/ compile/
      doc/core/src/     model/ sentence/ lower/ check/ facts/
      doc/html/src/     render/ style/
      math/core/src/    model/ number/ lower/ check/ evaluate/ facts/
      math/mathml/src/  render/ precedence/
      circuit/core/src/ model/ lower/ check/ elaborate/ simulate/ nor/ facts/
      circuit/svg/src/  layout/ render/
    output/markup/src/  model/ validate/ serialize/
    integration/suite/src/ profile/ bridge/ operation/ workspace/
    ui/core/src/ model/ message/ update/ command/ subscription/ view/
  apps/ cli/ lsp/ web/ provider/
  web/src/ shell/ editor/ worker/ preview/ storage/ bindings/
  site/
  editors/ vscode/ neovim/
  tools/src/ generate/ contract/ dependency/ task/
  examples/
  conformance/
  tasks/

ファイルめい階層かいそうは、ディレクトリであらわす。たとえば source_span_map.rs階層かいそうわりに使つかわず、source/map.rs とする。かく src直下ちょっかには、lib.rs または main.rsく。

2. おも依存方向いぞんほうこう

依存いぞんきは consumer -> dependencyあらわす。

text
reader -> core
engine -> core, reader
grammar-core -> core, reader, engine
doc-core -> core
math-core -> core
circuit-core -> core
markup -> core
doc-html -> doc-core, markup, core
math-tex -> math-core, core
math-mathml -> math-core, markup, core
circuit-svg -> circuit-core, markup, core
suite -> engine, reader, grammar-core, domain cores, output backends, core
wire -> core
ui-core -> core (公開操作のデータ契約のみ)
apps -> suite, core (+ wire where required, web -> ui-core)
tools -> grammar-core, suite, foundation

core は、すべてのdomainのenumをつものではない。typed schema、位置いち診断しんだん公開値こうかいち所有しょゆうする。domain coreは共通きょうつうのParsed treeをり、そのdomainのモデルへlowerする。engineはDocやRubyなどの意味いみらない。

DocないのMathとMathないのDocは、suiteのbridgeが処理しょりする。doc-coreはmath-coreをimportしない。出力しゅつりょくbackend同士どうしも、相互そうごにimportしない。suiteが依存関係いぞんかんけいしたがってみを準備じゅんびし、backendsへ型付かたつきの解決済かいけつずみfragmentをわたす。

ui-coreは、純粋じゅんすいなModel・Msg・update・viewと、commandおよびsubscriptionの記述きじゅつ所有しょゆうする。suiteやDOMを実行じっこうしてはならない。実行じっこう・Worker・editor widgetは、host adapterが担当たんとうする。目標もくひょうは20 crateで、そのうち15 crateが no_std + alloc である。この目標もくひょうを、実装済じっそうずみmemberのかず同一視どういつししてはならない。文書ぶんしょとsiteの生成せいせいは、toolsの明示的めいじてき段階だんかいおこなう。build.rsとおして、compilerと文書ぶんしょrendererを循環依存じゅんかんいぞんさせてはならない。

3. surface descriptorとGrammarのbootstrap

languages/*/syntax.neplg は、各言語かくげんごのsurface定義ていぎである。Grammar compilerがpackageを生成せいせいし、その生成済せいせいずみpackageもcommitする。通常つうじょうのbuildで、toolsやgrammar compilerをbuild dependencyにしてはならない。cargo run -p nepl3-tools -- generate --check により、sourceとの一致いっち検査けんさする。

Grammar自身じしん初期しょきpackageは、同一どういつのGrammar syntaxをあらわ検査済けんさずみseedとする。べつちいさなGrammar dialectはつくらない。seedで自身じしんのsourceをみ、compileしたdescriptorの意味正規形いみせいきけいとseedを比較ひかくする。これは自己じこホストまえ永続的えいぞくてきなbootstrap契約けいやくであり、将来しょうらい実装じっそうでもおなじseedを使つかえる。

4. Rust設定せってい

workspaceはedition 2024、resolver 3とする。MSRVは1.85.0以上いじょうとし、実装開始時じっそうかいしじ使つかひとつのstable toolchainを rust-toolchain.toml完全かんぜん版番号はんばんごう固定こていする。MSRVと開発かいはつtoolchainは同一視どういつししない。外部依存がいぶいぞんはworkspace.dependenciesで集中管理しゅうちゅうかんりし、Cargo.lockをcommitする。

coreけいcrateはつね#![no_std] とし、allocを使つかう。coreをstdするfeatureはもうけない。標準ひょうじゅんライブラリが必要ひつようなアダプタはappsへく。native-only crateがcoreにはいむことを、cargo metadataとtarget buildによって検出けんしゅつする。

math-coreは num-bigint / num-rational / num-integer / num-traits を、default-features=falseで利用りようしてよい。対応たいおうする互換ごかんversion集合しゅうごう一度いちどresolveし、lockする。ことなるBigIntのはんを、言語間げんごかん露出ろしゅつさせてはならない。公開こうかいする意味値いみちには、この仕様しようのcanonical integer・rationalがた使つかう。

安全あんぜんなRustを原則げんそくとする。FFIや高速化こうそくかのためにunsafeが必要ひつようなら、該当がいとうadapterの内部ないぶ局在きょくざいさせ、unsafe契約けいやく試験しけんえる。domainからpointerを外部がいぶ公開こうかいしてはならない。

5. 許可集合きょかしゅうごう検査けんさ

dependency checkerはproduction依存いぞんとbuild依存いぞん検査けんさし、dev依存いぞんべつ集合しゅうごうとして出力しゅつりょくする。productionからappsやtoolsへの経路けいろ、domain core同士どうし経路けいろ閉路へいろ、std依存いぞん検出けんしゅつする。外部がいぶcrateの採用さいようによって、coreへOS機能きのう混入こんにゅうしないことを確認かくにんする。

単一たんいつrepositoryであっても、かくcoreは独立どくりつして check --no-default-features できるものとする。将来しょうらいのrepository分割ぶんかつを、現在げんざい依存環境いぞんかんきょう強制きょうせいしない。公開こうかいschemaと操作そうさ単位たんいで、実装じっそう交換こうかんできるようにする。

外部言語がいぶげんご追加ついかでfoundation sourceを変更へんこうしない条件じょうけんと、repository分離前ぶんりまえ実証じっしょう外部拡張契約がいぶかくちょうけいやくしたがう。現時点げんじてんではmonorepoを維持いじし、独立どくりつworkspaceの公開こうかいAPI利用りようから、配布はいふ・provider・互換性試験ごかんせいしけんすすむ。

現在げんざい作業段階さぎょうだんかい

以上いじょうは、目標もくひょうとする構成こうせいである。現在げんざいのworkspace memberはルートCargo.tomlを、実装状態じっそうじょうたいはimplementation-status.jsonを正本せいほんとする。crateは、その責務せきむ実装じっそうする段階だんかい追加ついかする。開発かいはつtoolchainとMSRVの選定理由せんていりゆうはdoc/development.mdを、リポジトリ整備せいび判断はんだんはdoc/decisions/0001-repository-foundation.mdを参照さんしょうする。