Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions examples/be.coem
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#as palimpsest

let flag be black
let flag be yellow
let flag be red

know—flag—
6 changes: 6 additions & 0 deletions examples/briefly.coem
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
say—surrender—
say—alabaster—
let (switchblade|honeysuckle|goldenrod)
say—autumn— † despite the green in my eyes.
say—beauty— † despite daylight.
say—“i’d kill for it”—
10 changes: 10 additions & 0 deletions examples/cat-detected.be.coem
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
let (ch|k)at(|tze) be “🐈”

let savoir be know
savoir—chat is “🐈”—

let weten be know
weten—kat is “🐈”—

let wissen be know
wissen—katze is “🐈”—
6 changes: 6 additions & 0 deletions examples/docks.coem
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
let se(e|a) be “blue”
let mis(t|sed) be “thick”
let mou?rning be “dark”
let me be nothing
know—see, mist, morning—
know—sea, missed, mourning—
42 changes: 42 additions & 0 deletions examples/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>coem-lang sandbox</title>
</head>
<body>
<main>
<button id="echo">echo</button>
<label for="debug">debug</label><input id="debug" type="checkbox" />

<br />

<textarea id="coem" rows="30" cols="60"></textarea>

<hr />

<pre id="echoed"></pre>
</main>

<script type="module">
import { run, Environment } from "../src/main.js";

echo.addEventListener("click", async () => {
try {
const echoem = await run(
coem.value,
new Environment(),
debug.checked
);
echoed.innerText = echoem;
console.log(echoem);
} catch (e) {
echoed.innerText =
e.msg + "\n\n(full error description is logged to the console)";
console.error(e);
}
});
</script>
</body>
</html>
23 changes: 23 additions & 0 deletions examples/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// $ .../index.js file-name.coem

import { readFile } from "fs/promises";
import { join } from "path";

import { run, Environment } from "../src/main.js";

const coemFileName = process.argv[2];

if (!coemFileName) {
console.log("no coem file name provided");
process.exit();
}

const coem = await readFile(join(import.meta.dirname, coemFileName), "utf8");

const debug = false;
try {
const echo = await run(coem, new Environment(), debug);
console.log(echo);
} catch (e) {
console.error(e);
}
6 changes: 6 additions & 0 deletions examples/optimism.coem
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#with patience

while—maybe—:
know—optimism—.

know—peace—
9 changes: 9 additions & 0 deletions examples/reminder.coem
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
† this is a reminder

to breathe?——:
† in and out, and thus to
know—myself—.

let me|myself|I be “present”
if—I am “present”—:
let me be breath——.
6 changes: 6 additions & 0 deletions examples/sleep.coem
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
to sl?eep—when—:
“dreams”.

sleep—“now”—
sleep—“never”—
seep—“continually”—
1 change: 1 addition & 0 deletions examples/snail-train.coem
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
print—“i_@”—
3 changes: 3 additions & 0 deletions examples/snail-train.realtime.coem
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#with patience

print—“i_@”—
28 changes: 3 additions & 25 deletions index.js → examples/test.coem
Original file line number Diff line number Diff line change
@@ -1,8 +1,4 @@
import { run, Environment } from './src/main.js';

const debug = true;

const source = `#as palimpsest
#as palimpsest

to conditional——:
let tomorrow be not coming
Expand All @@ -28,29 +24,11 @@ to conditional——:
let end be “watching the sky burn”.

† conditional——

say—“It doesn’t matter.”—
say—“That would be enough.”—
let this be “us alive”
let this be “right here”
let this be “feeling lucky”
let you be wanting
this`;

function handleError(e, source = "") {
if (!e) return null;
console.error(e);
}

function handleOutput(...txt) {
console.log(...txt);
}

const browserEnv = new Environment();
try {
// console.log(run(source, browserEnv, handleOutput, false));
let echo = run(source, browserEnv, debug);
console.log(echo);
handleError(null);
} catch (e) {
handleError(e, source);
}
this
10 changes: 10 additions & 0 deletions examples/woman.coem
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
† based on Emmy Meli's “I Am Woman”

#as palimpsest

let I|me|myself be “woman”
let me be “fearless”
let me be “sexy”
let me be “divine”

know—myself—
13 changes: 10 additions & 3 deletions src/environment.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { runtimeError } from './errors.js';
import { runtimeError } from "./errors.js";

class Environment {

constructor(enclosing = null) {
this.values = new Map();
this.enclosing = enclosing;
this.withPatience = false;
}

get(token) {
Expand Down Expand Up @@ -42,6 +42,13 @@ class Environment {
Environment.asPalimpsest = true;
return;
}
if (
(name === "with" && value.literal === "patience") ||
(name === "read" && value.literal === "slowly")
) {
this.withPatience = true;
return;
}

let pattern = new RegExp(name);
let set = this.getSet(name);
Expand Down Expand Up @@ -81,4 +88,4 @@ class Environment {

Environment.asPalimpsest = false;

export { Environment };
export { Environment };
26 changes: 12 additions & 14 deletions src/main.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
// adapted from YALI.js by Daniel Berezin (danman113)
// https://github.com/danman113/YALI.js

import { Tokenizer } from './tokenizer.js';
import { Parser } from './parser.js';
import { Interpreter } from './interpreter.js';
import { Environment } from './environment.js';
import { Tokenizer } from "./tokenizer.js";
import { Parser } from "./parser.js";
import { Interpreter } from "./interpreter.js";
import { Environment } from "./environment.js";

// function run(code, environment, printfn, debug = false) {
function run(code, environment, debug = false) {
async function run(code, environment, debug = false) {
const tokenizer = new Tokenizer(code);
const tokens = tokenizer.scanTokens();
if (debug) console.log(tokens);
Expand All @@ -21,6 +21,11 @@ function run(code, environment, debug = false) {
lastStatement = interpreter.interpret(statement);
}
const echo = interpreter.getEcho();

if (environment.withPatience) {
await new Promise((res) => setTimeout(res, code.split("\n").length * 500));
}

return echo;
// return lastStatement;
}
Expand All @@ -33,12 +38,5 @@ function parse(code) {
return statements;
}

export { formatCoemError } from './errors.js';
export {
run,
parse,
Parser,
Tokenizer,
Interpreter,
Environment
};
export { formatCoemError } from "./errors.js";
export { run, parse, Parser, Tokenizer, Interpreter, Environment };