paren-debug
Debug parenthesis balance issues in Scheme files. Invoke when encountering "unexpected end-of-file reading list" or "unexpected close parenthesis" errors, or when manually counting parens.
Installation
Follow the repository instructions for this skill and your agent. Review the files and dependencies before adding it to your workflow.
View source ↗GuidesSkill instructions
Paren Debug Skill
When to Use
Invoke this skill when you encounter:
-
Exception in read: unexpected end-of-file reading list at line N -
Exception in read: unexpected close parenthesis at line N - Any situation where you're manually counting parentheses
- After editing Scheme code and getting parse errors
Tools Available
paren-locate - Primary Tool (Stack-Based)
The most useful tool. Shows exact locations of paren errors:
scheme -q <<'EOF'
(load "boundary/tools/paren-check.ss")
(paren-locate "path/to/file.ss")
EOF
Output format is compiler-friendly (file:line:col):
path/to/file.ss:46:1: error: unclosed '(' - never closed
path/to/file.ss:61:19: error: mismatched brackets: opened '[' at line 61 col 12, closed with ')'
paren-ok? - Quick Check
Returns #t if file is balanced, #f otherwise:
scheme -q <<'EOF'
(load "boundary/tools/paren-check.ss")
(paren-ok? "path/to/file.ss")
EOF
paren-errors - Programmatic Access
Returns list of error structs for further processing:
scheme -q <<'EOF'
(load "boundary/tools/paren-check.ss")
(paren-errors "path/to/file.ss")
EOF
paren-check - Legacy Balance Report
Line-by-line balance report (less precise but shows running totals):
scheme -q <<'EOF'
(load "boundary/tools/paren-check.ss")
(paren-check "path/to/file.ss")
EOF
./fold -c / ./fold --check-syntax - Quick CLI Check
Fast paren check from command line (no daemon needed):
./fold -c path/to/file.ss
./fold --check-syntax path/to/file.ss
Output:
# Success:
path/to/file.ss: ✓ All parentheses balanced
# Error:
path/to/file.ss:46:1: error: unclosed '(' - never closed
Exit codes: 0 = balanced, 1 = errors found.
Workflow
-
When you see a paren error: Run
paren-locatefirst - Read the error location: The output tells you exactly which opener was never closed
- Fix at the source: Go to the reported line/column and add the missing closer
-
Verify: Run
paren-ok?to confirm the fix
Example Session
# 1. You edited exports.ss and get:
# Exception in read: unexpected end-of-file reading list at line 46
# 2. Run paren-locate
scheme -q <<'EOF'
(load "boundary/tools/paren-check.ss")
(paren-locate "boundary/introspect/exports.ss")
EOF
# Output:
# boundary/introspect/exports.ss:46:1: error: unclosed '(' - never closed
# 3. The error is at line 46, column 1 - that's where the unclosed ( is!
# NOT at the end of the file where Scheme complained.
# 4. Fix and verify:
scheme -q <<'EOF'
(load "boundary/tools/paren-check.ss")
(paren-ok? "boundary/introspect/exports.ss")
EOF
# Output: #t
Error Types Detected
| Type | Message Pattern | Meaning |
|---|---|---|
unclosed |
unclosed '(' - never closed |
Opener at this location has no matching closer |
extra-close |
unexpected ')' - no matching opener |
Closer with no corresponding opener |
mismatch |
opened '[' at line X, closed with ')' |
Wrong bracket type used to close |
Tips
-
Don't count parens manually - always use
paren-locate - The error location is where to fix - unlike Scheme's error which points to where the list started
- Check after every significant edit - catch errors early
-
Mismatch detection - the tool catches
(foo]style errors that pure counting misses
File Location
boundary/tools/paren-check.ss - Load this to access all paren-checking functions.
Examples
Read the usage examples in the source repository.
View source ↗Source history
- Indexed on
- 2026-01-20
- Index updated
- 2026-01-26
- Branch
- main
Index and sync dates describe this directory. View the source repository for code history.
GitHub ↗chat Comments (0)
Sign in to join the discussion and leave a comment.
No comments yet. Be the first to share your thoughts!