Compare commits

...

2 Commits

Author SHA1 Message Date
9291e65c11 Use injected js, trampolines for curried functions 2024-11-14 13:09:54 -06:00
d0de70eb54 spacing 2024-11-14 12:46:48 -06:00
4 changed files with 29 additions and 10 deletions

View File

@ -2,7 +2,7 @@
fizzbuzz <- x ->
if x % 15 = 0 print("fizzbuzz")
elif x % 3 = 0 print("fizz")
# elif x % 5 = 0 print("buzz")
elif x % 5 = 0 print("buzz")
else print(x)
if x < 100 fizzbuzz(x + 1) ## TODO add looping construct(s)

View File

@ -37,6 +37,13 @@ impl <'a> LexicalContext<'a> {
}
}
/// Embeds the pre-written js
pub fn emit_injector(w: &mut dyn Write) -> std::io::Result<()>{
let bytes = include_bytes!("./js/deeinject.js");
write!(w, "{}", String::from_utf8_lossy(bytes))?;
Ok(())
}
pub fn emit_all(w: &mut dyn Write, ast: &Vec<parser::Stmt>, ctx: &mut LexicalContext) -> std::io::Result<()> {
let is_tail = ctx.is_tail;
ctx.is_tail = false;
@ -113,14 +120,17 @@ pub fn emit_expr(w: &mut dyn Write, expr: &parser::Expr, ctx: &mut LexicalContex
write!(w, "{}", atom)?;
}
parser::Expr::Funcall(id, args) => {
write!(w, "{}", munge(id))?;
if args.is_empty() {
write!(w, "()")?;
}
for arg in args {
write!(w, "(")?;
emit_expr(w, arg, ctx)?;
if let Some((last, butlast)) = args.split_last() {
write!(w, "T({}, ", munge(id))?;
for expr in butlast {
emit_expr(w, expr, ctx)?;
write!(w, ", ")?;
}
emit_expr(w, last, ctx)?;
write!(w, ")")?;
} else {
write!(w, "{}", munge(id))?;
write!(w, "()")?;
}
}
parser::Expr::Funcdef(arg, body) => {

10
src/js/deeinject.js Normal file
View File

@ -0,0 +1,10 @@
const print = console.log
function T(f, ...args) {
let res = f;
for (arg of args) {
res = res(arg);
}
return res;
}

View File

@ -53,8 +53,7 @@ fn script(cli: &Cli) {
println!("{:#?}", tree);
} else if cli.ecmascript {
let mut out = io::stdout();
// TODO remove this hack
writeln!(out, "const print = console.log;").ok();
emitter::emit_injector(&mut out).ok();
let mut toplevel = emitter::LexicalContext::toplevel();
emitter::emit_all(&mut out, &tree, &mut toplevel).ok();
} else {