- ArrayLiteral/MapLiteralのAST定義追加
- パーサーで[...]と{...}構文をサポート
- MIR Builderでnew Box() + push/setへのdesugaring実装
- テストケースとスモークスクリプト追加
- CURRENT_TASK.mdにネームスペース解決Phase-1計画を追記
- 3段階解決順序(ローカル→エイリアス→プラグイン)の設計合意
4.1 KiB
4.1 KiB
using — Imports and Namespaces (Phase 15+)
Status: Accepted (Runner‑side resolution). Selfhost parser accepts using as no‑op and attaches meta.usings for future use.
Policy
- Accept
usinglines at the top of the file to declare module namespaces or file imports. - Resolution is performed by the Rust Runner when
NYASH_ENABLE_USING=1.- Runner strips
usinglines from the source before parsing/execution. - Registers modules into an internal registry for path/namespace hints.
- Runner strips
- Selfhost compiler (Ny→JSON v0) collects using lines and emits
meta.usingswhen present. The bridge currently ignores this meta field.
Namespace Resolution (Runner‑side)
- Goal: keep IR/VM/JIT untouched. All resolution happens in Runner/Registry.
- Default search order (3 stages, deterministic):
- Local/Core Boxes (nyrt)
- Aliases (nyash.toml [imports] /
needs … as …) - Plugins (short name if unique, otherwise qualified
pluginName.BoxName)
- On ambiguity: error with candidates and remediation (qualify or define alias).
- Modes:
- Relaxed (default): short names allowed when unique.
- Strict: require plugin prefix (env
NYASH_PLUGIN_REQUIRE_PREFIX=1or nyash.toml[plugins] require_prefix=true).
- Aliases:
- nyash.toml
[imports] HttpClient = "network.HttpClient" - needs sugar:
needs plugin.network.HttpClient as HttpClient(file‑scoped alias)
- nyash.toml
Plugins
- Unified namespace with Boxes. Prefer short names when unique.
- Qualified form:
network.HttpClient - Per‑plugin control (nyash.toml):
prefix,require_prefix,expose_short_names
needs sugar (optional)
- Treated as a synonym to
usingon the Runner side; registers aliases only. - Examples:
needs utils.StringHelper,needs plugin.network.HttpClient as HttpClient,needs plugin.network.*
nyash.toml keys (MVP)
[imports]/[aliases]: short name → fully qualified[plugins.<name>]:path,prefix,require_prefix,expose_short_names
Index and Cache (Runner)
- Build a Box index once per run to make resolution fast and predictable:
struct BoxIndex {
local_boxes: HashMap<String, PathBuf>,
plugin_boxes: HashMap<String, Vec<PluginBox>>,
aliases: HashMap<String, String>,
}
- Maintain a small resolve cache per thread:
thread_local! {
static RESOLVE_CACHE: RefCell<HashMap<String, ResolvedBox>> = /* ... */;
}
- Trace:
NYASH_RESOLVE_TRACE=1prints resolution steps (for debugging/CI logs).
Syntax
- Namespace:
using core.stdorusing core.std as Std - File path:
using "apps/examples/string_p0.nyash" as Strings - Relative path is allowed; absolute paths are discouraged.
Style
- Place all
usinglines at the top of the file, before any code. - One using per line; avoid trailing semicolons. Newline separation is preferred.
- Order: sort alphabetically by target. Group namespaces before file paths.
- Prefer an explicit alias (
as ...) when the target is long. Suggested alias style isPascalCase(e.g.,Std,Json,UI).
Examples
using core.std as Std
using "apps/examples/string_p0.nyash" as Strings
static box Main {
main(args) {
local console = new ConsoleBox()
console.println("hello")
return 0
}
}
Qualified/Plugins/Aliases examples
# nyash.toml
[plugins.network]
path = "plugins/network.so"
prefix = "network"
require_prefix = false
[imports]
HttpClient = "network.HttpClient"
# code
needs plugin.network.HttpClient as HttpClient
static box Main {
main(args) {
let a = new HttpClient() # alias
let b = new network.HttpClient() # qualified
}
}
Runner Configuration
- Enable using pre‑processing:
NYASH_ENABLE_USING=1 - Selfhost pipeline keeps child stdout quiet and extracts JSON only:
NYASH_JSON_ONLY=1(set by Runner automatically for child) - Selfhost emits
meta.usingsautomatically when present; no additional flags required.
Notes
- Phase 15 keeps resolution in the Runner to minimize parser complexity. Future phases may leverage
meta.usingsfor compiler decisions. - Unknown fields in the top‑level JSON (like
meta) are ignored by the current bridge.