"The read-eval-print loop is the simplest possible interactive programming environment."
REPL stands for Read-Eval-Print Loop:
- Read: Read user input
- Eval: Execute/evaluate
- Print: Print result
- Loop: Return to step one
This is the simplest interactive programming environment. You input a line of code and immediately see the result.
>>> 1 + 1
2
>>> "hello".upper()
'HELLO'
>>> [x**2 for x in range(5)]
[0, 1, 4, 9, 16]The REPL concept comes from Lisp, invented by John McCarthy in 1958.
Lisp's REPL was revolutionary because it broke the traditional "write-compile-run" cycle, allowing programmers to explore instantly.
; Lisp REPL, 1960s
> (+ 1 2)
3
> (defun square (x) (* x x))
SQUARE
> (square 5)
25This "instant feedback" idea is the foundation of all modern interactive tools.
Unix Shell (sh, bash, zsh) is the operating system-level REPL:
$ ls -la
$ cd src
$ grep -r "TODO" .
$ git statusShell's REPL loop:
- Read: Read command line input
- Eval: Parse command, fork subprocess to execute
- Print: Display output
- Loop: Show new prompt
The greatness of Shell lies in exposing operating system capabilities to users through a simple text interface.
In 2009, Node.js brought server-side JavaScript and the Node.js REPL:
$ node
> const arr = [1, 2, 3, 4, 5]
undefined
> arr.filter(x => x % 2 === 0)
[ 2, 4 ]
> arr.reduce((sum, x) => sum + x, 0)
15Node.js REPL features:
- Multi-line input support
- Auto-completion
- History
- Can
requiremodules
In 2001, Fernando Pérez created IPython, which later evolved into Jupyter Notebook.
Jupyter took the REPL concept to new heights:
# Cell 1
import pandas as pd
df = pd.read_csv('data.csv')
df.head()
# Immediately displays table
# Cell 2
df.describe()
# Immediately displays statistics
# Cell 3
df.plot(kind='bar')
# Immediately displays chartJupyter's innovations:
- Cell model: Code executes in blocks, each with independent output
- Rich media output: Not just text, but charts, tables, HTML
- Persistent state: Variables shared between cells
- Narrative: Code and documentation mixed
Claude Code supports NotebookEditTool for directly editing Jupyter Notebooks, precisely because Notebooks have become central to data science workflows.
In 2022, ChatGPT brought the REPL concept to the natural language level:
User: Help me write a quicksort
ChatGPT: [provides code]
User: Modify it to support custom comparison functions
ChatGPT: [modifies code]
User: Add unit tests
ChatGPT: [adds tests]
This is a new type of REPL:
- Read: Read natural language input
- Eval: LLM understands and generates response
- Print: Output text/code
- Loop: Continue conversation
But ChatGPT's REPL has a fundamental limitation: it can only generate text, not execute actions.
Claude Code is the next step in REPL evolution: combining natural language REPL with tool execution.
User: Help me find all unused imports in the project and delete them
Claude Code:
→ GlobTool: Find all .ts files
→ FileReadTool: Read each file
→ Analyze unused imports
→ FileEditTool: Delete unused imports
→ BashTool: Run tsc to verify compilation passes
→ Complete, modified 23 files
This REPL's characteristics:
- Read: Read natural language intent
- Eval: Plan and execute tool invocation chain
- Print: Display execution process and results
- Loop: Wait for next instruction
| Dimension | Lisp REPL | Shell | Jupyter | ChatGPT | Claude Code |
|---|---|---|---|---|---|
| Input Type | Code | Commands | Code | Natural Language | Natural Language |
| Execution Capability | Computation | System Operations | Computation+Visualization | None | System Operations+Computation+Network |
| State Persistence | Session | Session | Notebook | Conversation | Conversation+File System |
| Output Type | Values | Text | Rich Media | Text | Text+Action Results |
| Composability | Low | High (Pipes) | Medium | Low | High (Tool Chains) |
Claude Code's REPL implementation is in src/entrypoints/cli.tsx, with the core loop roughly:
1. Display prompt, wait for user input
2. Parse input (slash command or natural language)
3. If slash command, execute directly
4. If natural language, submit to QueryEngine
5. QueryEngine calls Claude API, gets streaming response
6. When response contains tool calls, execute tools
7. Tool results backfilled into conversation, continue generation
8. Display final result
9. Return to step 1
This loop has several key design features:
Streaming display: Claude's response is streamed, users don't need to wait for complete response to see content.
Tool call transparency: Every tool call is shown to user, user can see what Claude is doing.
Interruptible: User can press Ctrl+C at any time to interrupt current operation.
History: Conversation history saved locally, can restore previous sessions.
The evolution of REPL is a history of lowering interaction barriers:
- Lisp REPL: Let programmers explore code instantly
- Shell: Let users operate operating system instantly
- Jupyter: Let data scientists explore data instantly
- ChatGPT: Let ordinary people interact with natural language
- Claude Code: Let developers operate codebases with natural language
Each step reduces friction from "idea to execution." Claude Code is currently the furthest step on this path.
Next Chapter: From Chatbot to Agent