Pre-adoption: language decisions to settle while we are the only users (lessons from other languages' v1 regrets)
维护者通常 1 天内回复
还没有人认领这个 Issue。
评估
调研方向
This is a design issue for the language owner, tracking foundational decisions before external adoption. It references the EigenScript codebase, stdlib modules, and builtins. A newcomer would need deep familiarity with language design and the codebase to contribute. The work involves evaluating each lesson (e.g., number types, string model, concurrency) and making decisions, likely leading to separate implementation issues.
由索引模型根据 Issue 内容生成。
描述
When: not a date. v1 follows real external consumers (after Linguist recognition and adoption work). But the day the FIRST outside consumer depends on a behavior, changing it stops being free and needs a migration path. So these decisions should be settled while we are still the only users. (Owner, 2026-09-23.)
Why: researched 2026-09-23 against primary sources. The recurring regrets of other languages, each mapped to where EigenScript stands. Probes were run on main c8288a5.
| Lesson | EigenScript now | To decide |
|---|---|---|
Build the breaking-change escape hatch before you need it. Go retrofitted per-module semantics via the go.mod version line + GODEBUG for the 1.22 loop-variable fix (go.dev/blog/loopvar-preview); Rust added editions (RFC 2052, 2017) two years after 1.0 (Book app. E). |
eigs.json has name/version, no language-version field. |
Add a language edition field now, so a post-adoption semantic fix can be opt-in per project. |
One overloaded number type later needs a second type bolted on. JS Number → BigInt (proposal). |
One IEEE double. 9007199254740992 + 1 prints 9007199254740992: silent precision loss past 2^53. |
An integer type, or raise on precision loss. Silence is the one option to rule out (it is the fail-soft class #975 exists to remove). |
Absence/null semantics are a founding decision. Hoare's "billion-dollar mistake"; JS typeof null could not be fixed because code depended on it. |
null, whose type of is "none"; a separate VAL_JSON_RAW value type. |
One documented absence model, one name for it. |
| Booleans folded into another type. | 1 == 1 → 1, type of → num. |
A boolean type, or document numbers-as-truth as permanent. |
| Remove before you freeze. Python's PEP 594 took three releases to drop dead modules (PEP 594); PHP's haystack/needle order was never unified (RFC). | 78 stdlib modules, 209 builtins. | Stdlib audit: cut what does not earn its place; a naming/argument-order lint rule while the surface is small. |
| The string model is the most expensive thing to change later. Python 2→3 (~12 years), Ruby 1.9 M17N (migration notes). | Byte strings with UTF-8 helpers. | Bytes vs text, and what a "character" is, decided and documented. |
| Concurrency added late becomes an ABI break. CPython GIL → PEP 703, free-threaded builds ABI-incompatible (PEP 703). | Threads/channels exist; hardening is a trail of fixes (#1146, #1173 open). | The concurrency safety model written down as a guarantee. |
| Freeze source semantics before binary contracts (Swift: source churn 1–3, ABI stability at 5 — swift.org). | Two binary-shaped contracts: the tape format and the opcode ABI. | Version each separately from the language edition. |
| Deprecation policy once users exist (Python PEP 387, ≥2 releases — PEP 387). | None needed yet (no external users). | Write it now, to switch on at the first outside consumer. |
Each row should become its own kind:decision issue when it is picked up; this issue tracks the set. Semantic decisions (numbers, booleans, absence, strings) are the owner's call; the recommendation in each row is a starting position, not a decision.
Done when
- Every one of the nine rows has a recorded verdict in a comment here: keep (with the measurement that justifies departing from the mature-language default, per the 2026-09-24 decision rule) or change. Rows: language edition field, number type / precision loss, absence model, boolean type, stdlib audit + naming/argument-order lint, string model, concurrency guarantee, binary-contract versioning (tape format + opcode ABI), deprecation policy.
- Every change row links its own
kind:decisionissue (with anarea:*label). Already defaulted to change and still without an issue: numbers, booleans, absence, strings, versioning (edition + deprecation policy), stdlib core/packages split. - The two rows with no default yet (concurrency guarantee, binary-contract versioning) have a verdict.
- The stdlib row's issue lists the package system's one-pin rule as a blocker before the first module moves out of
lib/. - The table in this body carries a "Verdict / issue" column filled for all nine rows, so status reads from the body, not the thread.
- 主要语言
- C
- 星标
- 3
- 派生
- 7
- 平均合并
- 4 小时 7 分钟
- 30 天内合并 PR
- 112
环境准备
在浏览器里用你自己的 GitHub 账号启动这个项目的开发容器。
- 提供 Dockerfile 或 Docker Compose 文件
- 有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
InauguralSystems/EigenScript 的其他 Issue
-
area:embed kind:silent-wrong
难度 2/5 1-3 小时 新手友好度 78/100
InauguralSystems/EigenScript#1387 ·
维护者通常 1 天内回复
-
area:stdlib kind:silent-wrong
难度 2/5 1-3 小时 新手友好度 86/100
InauguralSystems/EigenScript#1378 ·
维护者通常 1 天内回复
-
area:gates kind:gate-defect
难度 2/5 1-3 小时 新手友好度 78/100
InauguralSystems/EigenScript#1374 ·
维护者通常 1 天内回复
-
Error carets pad multi-byte UTF-8 byte-for-byte, so the ^ lands right of the token on a terminal未关闭area:lint-tooling kind:silent-wrong
难度 2/5 1-3 小时 新手友好度 84/100
InauguralSystems/EigenScript#1373 ·
维护者通常 1 天内回复
-
area:gates kind:docs-drift
难度 1/5 1 小时以内 新手友好度 88/100
InauguralSystems/EigenScript#1372 ·
维护者通常 1 天内回复
查看 InauguralSystems/EigenScript 的全部 Issue
相似的 Issue
-
难度 2/5 1-3 小时 新手友好度 90/100
BasedHardware/omi#19711 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 85/100
microsoft/ebpf-for-windows#5604 ·
维护者通常 3 天内回复
-
难度 2/5 1-3 小时 新手友好度 68/100
trezor/trezor-firmware#7985 ·
维护者通常 2 天内回复
-
难度 2/5 1-3 小时 新手友好度 84/100
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 70/100
维护者通常 2 天内回复