The scope tracker uses module-level state (pendingIdentifiers) that was not being cleared after FunctionCall reductions, causing identifier state to leak between tests. This caused the test 'readme.txt is Word when used in function' to break the following test by leaving 'echo' in pendingIdentifiers. - Add FunctionCall to the list of terms that clear pendingIdentifiers - Un-skip the previously failing test 'readme.txt is Word when used in function' 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> |
||
|---|---|---|
| packages | ||
| src | ||
| .gitignore | ||
| .gitmodules | ||
| bun.lock | ||
| bunfig.toml | ||
| CLAUDE.md | ||
| example.shrimp | ||
| package.json | ||
| README.md | ||
| today.md | ||
| tsconfig.json | ||
Shrimp Language
Overview
Shrimp is a shell-like scripting language that combines the simplicity of command-line interfaces with functional programming concepts. Built using Lezer (CodeMirror's parser system) with TypeScript.
Use it
Go to http://localhost:3000 to try out the playground.
echo "Hello, world!"
tail log.txt lines=50
name = "Shrimp"
greet = fn person: echo "Hello" person
result = tail log.txt lines=10
Language Design Philosophy
- Shell-like command syntax -
echo hello worldworks naturally - Everything is an expression - Commands, assignments, and functions all return values
- Whitespace matters in binary operations - Spaces distinguish operators from identifiers (e.g.,
x-1is an identifier,x - 1is subtraction) - Unbound symbols become strings -
echo hellotreatshelloas a string if not defined - Simplicity over cleverness - Each feature should work one way, consistently. Two simple features that are easy to explain beat one complex feature that requires lots of explanation
Parser Features
- ✅ Distinguishes identifiers from words to enable shell-like syntax - paths like
./file.txtwork without quotes - ✅ Smart tokenization for named args (
lines=30splits, but./path=valuestays together) - ✅ Handles ambiguous cases (bare identifier could be function call or variable reference)
Architecture
parser/ - Lezer grammar and tokenizers that parse Shrimp code into syntax trees
editor/ - CodeMirror integration with syntax highlighting and language support
compiler/ - Transforms syntax trees into ReefVM bytecode for execution
The flow: Shrimp source → parser (CST) → compiler (bytecode) → ReefVM (execution)
See example.shrimp for language examples and src/parser/shrimp.grammar for the full grammar.