From 2f2a8fe9f29cb43c07f9c4d6ce911b9c4b1771ed Mon Sep 17 00:00:00 2001 From: Chris Wanstrath Date: Sun, 5 Oct 2025 21:17:54 -0700 Subject: [PATCH] cli --- bin/reef | 14 ++++++++++++++ examples/add.reef | 3 +++ src/value.ts | 12 ++++++++++++ 3 files changed, 29 insertions(+) create mode 100755 bin/reef create mode 100644 examples/add.reef diff --git a/bin/reef b/bin/reef new file mode 100755 index 0000000..c533edb --- /dev/null +++ b/bin/reef @@ -0,0 +1,14 @@ +#!/usr/bin/env bun + +import { toBytecode } from "../src/bytecode" +import { run } from "../src/index" +import { toJs } from "../src/value" + +const file = Bun.argv[2] +if (!file || !await Bun.file(file).exists()) { + console.error("usage: reef ") + process.exit(1) +} + +const value = await run(toBytecode(await Bun.file(file).text())) +console.log(toJs(value)) \ No newline at end of file diff --git a/examples/add.reef b/examples/add.reef new file mode 100644 index 0000000..8a1dd0d --- /dev/null +++ b/examples/add.reef @@ -0,0 +1,3 @@ +PUSH 1 +PUSH 2 +ADD diff --git a/src/value.ts b/src/value.ts index 2445e18..4bf524f 100644 --- a/src/value.ts +++ b/src/value.ts @@ -119,4 +119,16 @@ export function isEqual(a: Value, b: Value): boolean { } case 'function': return false // functions never equal } +} + +export function toJs(v: Value): any { + switch (v.type) { + case 'null': return null + case 'boolean': return v.value + case 'number': return v.value + case 'string': return v.value + case 'array': return v.value.map(toJs) + case 'dict': return Object.fromEntries(v.value.entries().map(([k, v]) => [k, toJs(v)])) + case 'function': return '' + } } \ No newline at end of file