./bin/repl <file>

This commit is contained in:
Chris Wanstrath 2025-10-25 15:52:11 -07:00
parent e95c8e5018
commit 0ff0dd5380

View File

@ -3,7 +3,8 @@
import { Compiler } from '../src/compiler/compiler' import { Compiler } from '../src/compiler/compiler'
import { VM, type Value, Scope, bytecodeToString } from 'reefvm' import { VM, type Value, Scope, bytecodeToString } from 'reefvm'
import * as readline from 'readline' import * as readline from 'readline'
import * as fs from 'fs' import { readFileSync, writeFileSync } from 'fs'
import { basename } from 'path'
const colors = { const colors = {
reset: '\x1b[0m', reset: '\x1b[0m',
@ -39,6 +40,14 @@ async function repl() {
let codeHistory: string[] = [] let codeHistory: string[] = []
let vm: VM | null = null let vm: VM | null = null
// Load file if provided as argument
const filePath = process.argv[2]
if (filePath) {
const loaded = await loadFile(filePath)
vm = loaded.vm
codeHistory = loaded.codeHistory
}
showWelcome() showWelcome()
rl.prompt() rl.prompt()
@ -137,7 +146,7 @@ async function repl() {
const content = codeHistory.join('\n') + '\n' const content = codeHistory.join('\n') + '\n'
try { try {
fs.writeFileSync(finalFilename, content, 'utf-8') writeFileSync(finalFilename, content, 'utf-8')
console.log(`\n${colors.green}✓${colors.reset} Saved ${codeHistory.length} line${codeHistory.length === 1 ? '' : 's'} to ${colors.bright}${finalFilename}${colors.reset}`) console.log(`\n${colors.green}✓${colors.reset} Saved ${codeHistory.length} line${codeHistory.length === 1 ? '' : 's'} to ${colors.bright}${finalFilename}${colors.reset}`)
} catch (error: any) { } catch (error: any) {
console.log(`\n${colors.red}Error:${colors.reset} Failed to save file: ${error.message}`) console.log(`\n${colors.red}Error:${colors.reset} Failed to save file: ${error.message}`)
@ -241,6 +250,42 @@ function formatVariables(scope: Scope, onlyFunctions = false): string {
return vars.join('\n') return vars.join('\n')
} }
async function loadFile(filePath: string): Promise<{ vm: VM; codeHistory: string[] }> {
try {
const fileContent = readFileSync(filePath, 'utf-8')
const lines = fileContent.trim().split('\n')
console.log(`${colors.dim}Loading ${basename(filePath)}...${colors.reset}`)
const vm = new VM({ instructions: [], constants: [] }, nativeFunctions)
await vm.run()
const codeHistory: string[] = []
for (const line of lines) {
const trimmed = line.trim()
if (!trimmed) continue
try {
const compiler = new Compiler(trimmed)
vm.appendBytecode(compiler.bytecode)
await vm.continue()
codeHistory.push(trimmed)
} catch (error: any) {
console.log(`${colors.red}Error in ${basename(filePath)}:${colors.reset} ${error.message}`)
process.exit(1)
}
}
console.log(`${colors.green}✓${colors.reset} Loaded ${codeHistory.length} line${codeHistory.length === 1 ? '' : 's'}\n`)
return { vm, codeHistory }
} catch (error: any) {
console.log(`${colors.red}Error:${colors.reset} Could not load file: ${error.message}`)
process.exit(1)
}
}
function showWelcome() { function showWelcome() {
console.log( console.log(
`${colors.pink}═══════════════════════════════════════════════════════════════${colors.reset}` `${colors.pink}═══════════════════════════════════════════════════════════════${colors.reset}`
@ -250,6 +295,7 @@ function showWelcome() {
`${colors.pink}═══════════════════════════════════════════════════════════════${colors.reset}` `${colors.pink}═══════════════════════════════════════════════════════════════${colors.reset}`
) )
console.log(`\nType Shrimp expressions. Press ${colors.bright}Ctrl+D${colors.reset} to exit.`) console.log(`\nType Shrimp expressions. Press ${colors.bright}Ctrl+D${colors.reset} to exit.`)
console.log(`${colors.dim}Usage: bun bin/repl [file.shrimp]${colors.reset}`)
console.log(`\nCommands:`) console.log(`\nCommands:`)
console.log(` ${colors.bright}/clear${colors.reset} - Clear screen and reset state`) console.log(` ${colors.bright}/clear${colors.reset} - Clear screen and reset state`)
console.log(` ${colors.bright}/reset${colors.reset} - Reset state (keep history visible)`) console.log(` ${colors.bright}/reset${colors.reset} - Reset state (keep history visible)`)