Known Limitations
Not a beginner lesson
This page lists what Echo does not do yet, plus a historical feature timeline. For learning, use Learn Echo. Current package version: 2.2.1.
What Echo still does not do. As of 2.2.1, the language includes modules (sibling + nested / relative paths, std/… install-tree imports through std/re / std/time / std/yaml / std/math / std/random, optional --require-std prelude policy, clearer cycle / not-found diagnostics), CLI tooling (check / test / fmt / lint / builtins / std / lsp / ide), first-class functions, const / destructuring / unions / switch, nominal classes with new { ... } fields (including defaults), bound/unbound/type methods, optional implements, interfaces (no inheritance), compound assignment on members, priv visibility, positional construction, deep clone(), named format placeholders, class properties (get / set), recursive mkdirAll / removeTree, regex builtins (also std/re), union narrowing in if type(...), thin UTC dates (also std/time), thin HTTP (also std/http), thin URL helpers (also std/url), Base64 helpers (also std/base64), YAML helpers (yamlParse / yamlParseOr / yamlWrite, also std/yaml, E2855), file/JSON/env helpers also via std/fs / std/json / std/os, math / random / now / wait / run also via std modules, watch location / abort dumps, abort Stack: dumps and trace, documented E2801 / E2850–E2855 and module E3001–E3005 codes, playground host-policy docs plus playground std/… / YAML demos, a thin elang lsp stub wired into the editor extension (diagnostics, builtin hover, goto-def; task matchers remain as fallback), and generated builtin + std inventories (tools/sync_builtins.py). 2.0 is path resolution + std modules — not a package registry. 2.1 is YAML + LSP stub + std maturity on that surface. This page is the remainder — not a changelog.
Already in (summary)
- Core syntax and file modules (
import/export; nested / relative paths in 2.0.0;std/…in 2.0.2) - Host/stdlib, REPL,
check/test/fmt/lint - 0.6–0.7: lambdas, collection helpers,
const, destructuring, exact objects, unions,switch, range-as-value - 0.8:
class+new { ... }, methods +this, unbound/type methods,interface, optionalimplements - 0.9.0: compound assignment on class fields (
this.x += 1) - 0.9.1:
privon fields and methods (class-private) - 0.9.2: positional construction
Point(3, 4)(namedPoint { ... }still works) - 0.9.3: deep
clone()for lists, hashes, and class instances - 0.9.4: named
format()placeholders via trailing hash - 0.9.5: class properties
get/set(soft keywords; field-style access) - 0.9.6:
mkdirAll(path)/removeTree(path)for recursive create/delete - 0.9.7:
regexMatch/regexFind/regexReplace/regexSplit(Pythonre) - 0.9.8: union narrowing in
if type(x) == "..."(and matchingelse if) - 0.9.9:
formatTime/parseTime(UTC) plusdays/hours/minutes - 1.0.0: stable release (same surface as 0.9.9)
- 1.1.0:
httpGet/httpPostwithHost.allow_http - 1.1.1: request headers,
httpOk/httpRedirect,httpGetOr/httpPostOr - 1.1.2:
urlEncode/urlDecode/urlJoin/urlQuery - 1.1.3:
watchsource locations +Watched:dump on abort - 1.1.4: error-message / code pass (E2801, E2850–E2853 documented)
- 1.1.5: playground host-policy docs (CLI vs playground
Host) - 1.1.6:
tools/sync_builtins.py+ builtin inventory page - 1.1.7:
base64Encode/base64Decode(E2854) - 1.1.8:
elang builtins(+-V/ help epilog) - 1.1.9: series close (README / examples / playground docs for full 1.1 surface)
- 2.0.0: relative / nested import paths (
"./math","lib/math","../shared") - 2.0.1: clearer E3001–E3003 diagnostics (looked-for path, import location, nested cycle labels)
- 2.0.2:
import … from "std/…"from the Echo install tree (seedstd/meta) - 2.0.3: HTTP family via
std/http(prelude names still work) - 2.0.4: URL + Base64 via
std/url/std/base64(prelude dual-path) - 2.0.5: files / JSON / env via
std/fs/std/json/std/os(prelude dual-path) - 2.0.6: regex + dates via
std/re/std/time(prelude dual-path) - 2.0.7: optional
--require-std/Host.require_std(core vs peeled prelude) - 2.0.8: docs / examples / playground for multi-file +
std/… - 2.0.9: 2.0.x series close (path resolution + std modules, not a package manager)
- 2.1.0:
yamlParse/yamlWrite(E2855);std/yaml - 2.1.1:
yamlParseOr+ failure-model / docs - 2.1.2:
elang lspthin stdio stub (diagnostics + builtin hover) - 2.1.3: LSP goto-def for local + imported symbols
- 2.1.4: editor LSP client (
elang lspvia vscode-languageclient; task matchers remain) - 2.1.5: abort
Stack:dump +tracehelper (no stepper) - 2.1.6: further std peel (
std/math,std/random;now/waitonstd/time;runonstd/os) - 2.1.7:
elang stdlists install-treestd/…modules (--exports/--count/--path) - 2.1.8: generated Std Inventory docs page (
tools/sync_builtins.py) - 2.1.9: 2.1.x series close (YAML + LSP stub + std maturity on 2.0 modules)
- 2.2.0:
elang idedesktop editor (Tk window: edit → Run → output, line numbers, syntax highlight) - 2.2.1: crash hardening + path safety (oversized ints / recursion / symlink +
removeTreeguards; fmt / switch unescaping)
Details: Roadmap and CHANGELOG.md.
Current Limitations
- No class inheritance (
extends); shared behavior is interfaces + composition - No generics
- No exceptions such as
try/catch— abort stays the default; recovery is inquiry and*Ortwins (failure model).elang testmay continue afterexpect*failures; that is runner-only, not in-language recovery - No overloads
- Function scope is lexical; reassignment of outer variables still requires
use mut - Nested collections inside a frozen list/hash are not recursively frozen; a nested value reached through a different mutable name can still be mutated
- Open object type aliases accept extra fields; use
exact { ... }to reject them nullis not a type — usestr | voidwhen a binding may holdnull. Full flow-sensitive typing beyond simple-nameif type(...)guards is not implemented- Hash runtime indexing only supports string keys
format()has no width / precision / alignment specs- Properties are not part of interfaces (
implementsstill checks methods only) - Interpolation tokenization is not fully strict
- No date object type / local-timezone calendars (UTC unix seconds +
formatTime/parseTimeonly) - HTTP is thin (no cookies/session client, no multipart); playground denies HTTP (
allow_http=False) - No full LSP-as-product (thin
elang lsp+ editor client ship in 2.1.2–2.1.4; tasks/matchers remain) elang ideis an MVP desktop editor (edit / Run / output, Open/Save, syntax highlight) — no autocomplete, no debugger, no project tree, no LSP inside the window; interactiveask/readLineare limited (non-interactive programs are the happy path)- No full debugger / stepper (abort
Stack:+watch+traceship through 2.1.5) - No package registry yet (stdlib peels + optional
--require-stdshipped through 2.0.7)
Why this page exists
So docs do not oversell the language, and so shipped work is not mistaken for missing.
Where next work is tracked
See Failure model, Roadmap, and priority.
