mirror of
https://github.com/azur1s/bobbylisp.git
synced 2024-10-16 02:37:40 -05:00
tuples codegen & some examples
This commit is contained in:
parent
47fbb70b8d
commit
1f9a9cdf71
|
@ -75,7 +75,7 @@ impl Codegen {
|
|||
"len" => { format!("{}.length", self.gen_ir(&args[0], false)) },
|
||||
|
||||
"throw" => { format!("throw new Error({}){}", self.gen_ir(&args[0], false), semicolon!()) },
|
||||
_ => unreachable!(format!("Unknown intrinsic: {}", name)) // Shoul be handled by lowering
|
||||
_ => unreachable!("{}", format!("Unknown intrinsic: {}", name)) // Shoul be handled by lowering
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -86,7 +86,7 @@ impl Codegen {
|
|||
.collect::<Vec<_>>().
|
||||
join(", ");
|
||||
format!(
|
||||
"{} const _{} = ({}): {} => {};\n",
|
||||
"{} const _{} = ({}): {} => {{{}}};\n",
|
||||
if *public { "export" } else { "" },
|
||||
name,
|
||||
args,
|
||||
|
@ -156,6 +156,16 @@ impl Codegen {
|
|||
}
|
||||
},
|
||||
|
||||
IRKind::Tuple { values } => {
|
||||
format!(
|
||||
"[{}]",
|
||||
values
|
||||
.iter()
|
||||
.map(|value| self.gen_ir(value, false))
|
||||
.collect::<Vec<_>>()
|
||||
.join(", ")
|
||||
)
|
||||
},
|
||||
IRKind::Vector { values } => {
|
||||
format!(
|
||||
"[{}]",
|
||||
|
|
|
@ -450,6 +450,7 @@ pub fn expr_to_ir(expr: &Expr) -> (Option<IRKind>, Option<LoweringError>) {
|
|||
fn gen_type_hint(type_hint: &Typehint) -> String {
|
||||
match type_hint {
|
||||
Typehint::Single(t) => match t.as_str() {
|
||||
"any" => "any".to_string(),
|
||||
"int" => "number".to_string(),
|
||||
"bool" => "boolean".to_string(),
|
||||
_ => t.to_string()
|
||||
|
|
33
example/tuples.hz
Normal file
33
example/tuples.hz
Normal file
|
@ -0,0 +1,33 @@
|
|||
-- This is a rewrite of runtime/tuples.ts in itself
|
||||
fun every_ (a : [any]) (b : [any]) (current : int) : bool = do
|
||||
if @len(a) == current
|
||||
then return true
|
||||
else
|
||||
do
|
||||
let aa : any = @get(a, current)
|
||||
let bb : any = @get(b, current)
|
||||
if aa == bb
|
||||
then return every_(a, b, current + 1)
|
||||
else return false end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
fun every (a : [any]) (b : [any]): bool = return every_(a, b, 0)
|
||||
|
||||
fun eqTuples (a : [any]) (b : [any]) : bool =
|
||||
match @len(a) == @len(b) with
|
||||
| true -> return every(a, b)
|
||||
| else return false
|
||||
end
|
||||
|
||||
fun main : void = do
|
||||
let foo : (int, int) = (1, 3)
|
||||
let bar : (int, int) = (2, 1)
|
||||
let baz : (int, int, int) = (1, 3, 1)
|
||||
eqT(foo, bar) |> @write(_)
|
||||
@write("\n")
|
||||
eqT(foo, baz) |> @write(_)
|
||||
@write("\n")
|
||||
eqT(foo, (1, 3)) |> @write(_)
|
||||
end
|
4
runtime/tuples.ts
Normal file
4
runtime/tuples.ts
Normal file
|
@ -0,0 +1,4 @@
|
|||
export function eqTuples(a: any[], b: any[]) {
|
||||
if (a.length !== b.length) return false;
|
||||
return a.every((elem, i) => b[i] === elem);
|
||||
}
|
Loading…
Reference in a new issue