MANDATORY - Load this skill BEFORE using brepl in any way. Teaches the heredoc pattern for reliable code evaluation.
IMPORTANT: Do NOT try to manually repair parenthesis errors.
If you encounter unbalanced delimiters, run brepl balance <name> --write on the file
instead of attempting to fix them yourself. If the tool doesn't work,
report to the user that they need to fix the delimiter error manually.
The tool automatically formats files with cljfmt when it processes them.
brepl is a REPL client for evaluating Clojure expressions. This skill teaches the heredoc pattern for reliable code evaluation.
Always use the heredoc pattern for all Clojure code evaluation.
Always use heredoc for brepl evaluation. This eliminates quoting issues, works for all cases, and provides a consistent, reliable pattern.
brepl <<'EOF'
(your clojure code here)
EOF
This is the simplest heredoc syntax - stdin feeds directly to brepl.
For simple one-liners, you can use positional arguments:
brepl '(+ 1 2 3)'
Heredoc is preferred for anything with quotes or multiple lines.
Note: The -e flag is optional - brepl automatically treats stdin and positional arguments as code to evaluate.
Important: Use <<'EOF' (with quotes) not <<EOF to prevent shell variable expansion.
Multi-line expressions:
brepl <<'EOF'
(require '[clojure.string :as str])
(str/join ", " ["a" "b" "c"])
EOF
Code with quotes:
brepl <<'EOF'
(println "String with 'single' and \"double\" quotes")
EOF
Reloading and testing:
brepl <<'EOF'
(require '[myapp.core] :reload)
(myapp.core/some-function "test" 123)
EOF
Complex data structures:
brepl <<'EOF'
(def config
{:database {:host "localhost"
:port 5432
:name "mydb"}
:api {:key "secret-key"
:endpoint "https://api.example.com"}})
(println (:database config))
EOF
Running tests:
brepl <<'EOF'
(require '[clojure.test :refer [run-tests]])
(require '[myapp.core-test] :reload)
(run-tests 'myapp.core-test)
EOF
For very simple expressions, you can use direct positional arguments:
# Simple expression
brepl '(inc 1)'
# Same with heredoc (consistent approach)
brepl <<'EOF'
(inc 1)
EOF
Why prefer heredoc: No mental overhead deciding which pattern to use, no risk of quoting issues, easy to extend.
To load an entire file into the REPL:
brepl -f src/myapp/core.clj
After loading, you can evaluate functions from that namespace using either pattern.
Use brepl balance to fix unbalanced brackets in Clojure files using parmezan:
# Fix file in place (default)
brepl balance src/myapp/core.clj
# Preview fix to stdout
brepl balance src/myapp/core.clj --dry-run
This is useful for recovering files with bracket errors.
brepl <<'EOF'
(require '[myapp.core] :reload-all)
EOF
brepl <<'EOF'
(require '[clojure.repl :refer [doc source]])
(doc map)
(source filter)
EOF
brepl <<'EOF'
*e
(require '[clojure.repl :refer [pst]])
(pst)
EOF
<<'EOF' not <<EOF to prevent shell expansionConsistency over optimization. While simple positional arguments work for basic cases, using heredoc everywhere means:
<<'EOF' and EOF is literalShell quoting with Clojure is error-prone: Clojure uses both single and double quotes, nested quotes require escaping, and reader macros can confuse the shell. Heredoc eliminates all these issues.
brepl documentation: https://github.com/licht1stein/brepl