some more intrinsic, refactor map example

pull/4/head
Natapat Samutpong 2022-04-11 05:47:52 +07:00
parent 1f9a9cdf71
commit 1a517da5a1
3 changed files with 15 additions and 11 deletions

View File

@ -73,6 +73,8 @@ impl Codegen {
"get" => { format!("{}[{}]", self.gen_ir(&args[0], false), self.gen_ir(&args[1], false)) },
"len" => { format!("{}.length", self.gen_ir(&args[0], false)) },
"insert" => { format!("{}.push({})", self.gen_ir(&args[0], false), self.gen_ir(&args[1], false)) },
"concat" => { format!("{}.concat({})", self.gen_ir(&args[0], false), self.gen_ir(&args[1], false)) },
"throw" => { format!("throw new Error({}){}", self.gen_ir(&args[0], false), semicolon!()) },
_ => unreachable!("{}", format!("Unknown intrinsic: {}", name)) // Shoul be handled by lowering

View File

@ -1,7 +1,7 @@
use std::ops::Range;
use parser::types::{Expr, Typehint};
const INTRINSICS: [&str; 8] = [
const INTRINSICS: [&str; 10] = [
"write",
"read",
"write_file",
@ -9,6 +9,8 @@ const INTRINSICS: [&str; 8] = [
"emit",
"get",
"len",
"insert",
"concat",
"throw",
];

View File

@ -1,23 +1,23 @@
fun map_ (vec: [int]) (fn: |int| -> int) (current: int): void = do
fun map_ (vec: [int]) (fn: |int| -> int) (current: int): [int] = do
if current == @len(vec) then
do end
return []
else
do
@get(vec, current)
|> fn(_)
|> @write(_)
@write("\n")
let new : [int] = []
let x : int = @get(vec, current) |> fn(_)
@insert(new, x)
map_(vec, fn, current + 1)
let y : [int] = map_(vec, fn, current + 1)
return @concat(new, y)
end
end
end
fun map (vec: [int]) (fn: |int| -> int): void = map_(vec, fn, 0)
fun map (vec: [int]) (fn: |int| -> int): [int] = return map_(vec, fn, 0)
fun mul10 (x: int): int = x * 10
fun mul10 (x: int): int = return x * 10
fun main: void = do
let foo: [int] = [69, 420, 727, 1337, 42069, 69420]
map(foo, mul10)
map(foo, mul10) |> @write(_)
end