diff --git a/crates/aiken-lang/src/ast.rs b/crates/aiken-lang/src/ast.rs index 2d59a8c7..2b6f0c9a 100644 --- a/crates/aiken-lang/src/ast.rs +++ b/crates/aiken-lang/src/ast.rs @@ -703,7 +703,7 @@ pub enum Pattern { }, /// A name given to a sub-pattern using the `as` keyword. - /// e.g. `assert #(1, [_, _] as the_list) = x` + /// e.g. `assert (1, [_, _] as the_list) = x` Assign { name: String, location: Span, diff --git a/crates/aiken-lang/src/format.rs b/crates/aiken-lang/src/format.rs index 716a1eff..ca5587d7 100644 --- a/crates/aiken-lang/src/format.rs +++ b/crates/aiken-lang/src/format.rs @@ -396,13 +396,9 @@ impl<'comments> Formatter<'comments> { .. } => docvec![module, ".", name], - Constant::Tuple { elements, .. } => "#" - .to_doc() - .append(wrap_args( - false, - elements.iter().map(|e| (self.const_expr(e), false)), - )) - .group(), + Constant::Tuple { elements, .. } => { + wrap_args(false, elements.iter().map(|e| (self.const_expr(e), false))).group() + } } } @@ -480,10 +476,9 @@ impl<'comments> Formatter<'comments> { .append(break_("", " ").append(self.annotation(retrn)).nest(INDENT)), Annotation::Var { name, .. } => name.to_doc(), - Annotation::Tuple { elems, .. } => "#".to_doc().append(wrap_args( - false, - elems.iter().map(|t| (self.annotation(t), false)), - )), + Annotation::Tuple { elems, .. } => { + wrap_args(false, elems.iter().map(|t| (self.annotation(t), false))) + } } .group() } @@ -768,13 +763,9 @@ impl<'comments> Formatter<'comments> { .. } => self.record_update(constructor, spread, args), - UntypedExpr::Tuple { elems, .. } => "#" - .to_doc() - .append(wrap_args( - false, - elems.iter().map(|e| (self.wrap_expr(e), false)), - )) - .group(), + UntypedExpr::Tuple { elems, .. } => { + wrap_args(false, elems.iter().map(|e| (self.wrap_expr(e), false))).group() + } UntypedExpr::TupleIndex { index, tuple, .. } => { let suffix = Ordinal(*index + 1).suffix().to_doc(); @@ -1500,13 +1491,9 @@ impl<'comments> Formatter<'comments> { Pattern::Discard { name, .. } => name.to_doc(), - Pattern::Tuple { elems, .. } => "#" - .to_doc() - .append(wrap_args( - false, - elems.iter().map(|e| (self.pattern(e), false)), - )) - .group(), + Pattern::Tuple { elems, .. } => { + wrap_args(false, elems.iter().map(|e| (self.pattern(e), false))).group() + } Pattern::List { elements, tail, .. } => { let elements_document = diff --git a/crates/aiken-lang/src/parser.rs b/crates/aiken-lang/src/parser.rs index 4206104f..8eb38b3a 100644 --- a/crates/aiken-lang/src/parser.rs +++ b/crates/aiken-lang/src/parser.rs @@ -346,12 +346,14 @@ fn constant_value_parser() -> impl Parser impl Parser } }), // Tuple - just(Token::Hash) - .ignore_then( - r.clone() - .separated_by(just(Token::Comma)) - .allow_trailing() - .delimited_by(just(Token::LeftParen), just(Token::RightParen)), - ) + r.clone() + .separated_by(just(Token::Comma)) + .at_least(2) + .allow_trailing() + .delimited_by(just(Token::LeftParen), just(Token::RightParen)) .map_with_span(|elems, span| ast::Annotation::Tuple { location: span, elems, @@ -1607,13 +1609,10 @@ pub fn pattern_parser() -> impl Parser self.type_var_doc(&typ.borrow()), - Type::Tuple { elems, .. } => self.args_to_aiken_doc(elems).surround("#(", ")"), + Type::Tuple { elems, .. } => self.args_to_aiken_doc(elems).surround("(", ")"), } } diff --git a/examples/acceptance_tests/006/lib/tests.ak b/examples/acceptance_tests/006/lib/tests.ak index 9b49e9d0..4de15698 100644 --- a/examples/acceptance_tests/006/lib/tests.ak +++ b/examples/acceptance_tests/006/lib/tests.ak @@ -1,3 +1,3 @@ test foo() { - #(1, []) == #(1, []) + (1, []) == (1, []) } diff --git a/examples/acceptance_tests/007/lib/tests.ak b/examples/acceptance_tests/007/lib/tests.ak index 570c7b2f..82fc7f83 100644 --- a/examples/acceptance_tests/007/lib/tests.ak +++ b/examples/acceptance_tests/007/lib/tests.ak @@ -1,9 +1,9 @@ -pub fn unzip(xs: List<#(a, b)>) -> #(List, List) { +pub fn unzip(xs: List<(a, b)>) -> (List, List) { when xs is { - [] -> #([], []) - [#(a, b), ..rest] -> { - let #(a_tail, b_tail) = unzip(rest) - #([a, ..a_tail], [b, ..b_tail]) + [] -> ([], []) + [(a, b), ..rest] -> { + let (a_tail, b_tail) = unzip(rest) + ([a, ..a_tail], [b, ..b_tail]) } } } diff --git a/examples/acceptance_tests/013/lib/tests.ak b/examples/acceptance_tests/013/lib/tests.ak index 8f0aa2bb..311de32f 100644 --- a/examples/acceptance_tests/013/lib/tests.ak +++ b/examples/acceptance_tests/013/lib/tests.ak @@ -1,13 +1,13 @@ -pub fn unzip(xs: List<#(a, b)>) -> #(List, List) { +pub fn unzip(xs: List<(a, b)>) -> (List, List) { when xs is { - [] -> #([], []) - [#(a, b), ..rest] -> { - let #(a_tail, b_tail) = unzip(rest) - #([a, ..a_tail], [b, ..b_tail]) + [] -> ([], []) + [(a, b), ..rest] -> { + let (a_tail, b_tail) = unzip(rest) + ([a, ..a_tail], [b, ..b_tail]) } } } test unzip_1() { - unzip([#(1, "a"), #(2, "b")]) == #([1, 2], ["a", "b"]) + unzip([(1, "a"), (2, "b")]) == ([1, 2], ["a", "b"]) } diff --git a/examples/acceptance_tests/015/lib/tests.ak b/examples/acceptance_tests/015/lib/tests.ak index bc5b08a7..c3ba6fb3 100644 --- a/examples/acceptance_tests/015/lib/tests.ak +++ b/examples/acceptance_tests/015/lib/tests.ak @@ -1,5 +1,5 @@ pub opaque type Map { - inner: List<#(key, value)>, + inner: List<(key, value)>, } pub fn new() { diff --git a/examples/acceptance_tests/016/lib/tests.ak b/examples/acceptance_tests/016/lib/tests.ak index 38094132..9c658c82 100644 --- a/examples/acceptance_tests/016/lib/tests.ak +++ b/examples/acceptance_tests/016/lib/tests.ak @@ -16,4 +16,3 @@ test drop_1() { let x = #[1, 2, 3, 4, 5, 6, 7] drop(x, 2) == #[3, 4, 5, 6, 7] } - diff --git a/examples/acceptance_tests/023/lib/tests.ak b/examples/acceptance_tests/023/lib/tests.ak index 4c8ab00f..cdafc006 100644 --- a/examples/acceptance_tests/023/lib/tests.ak +++ b/examples/acceptance_tests/023/lib/tests.ak @@ -1,12 +1,12 @@ pub opaque type AssocList { - inner: List<#(key, value)>, + inner: List<(key, value)>, } pub fn new() -> AssocList { AssocList { inner: [] } } -pub fn to_list(m: AssocList) -> List<#(key, value)> { +pub fn to_list(m: AssocList) -> List<(key, value)> { m.inner } @@ -19,17 +19,17 @@ pub fn insert( } fn do_insert( - elems: List<#(key, value)>, + elems: List<(key, value)>, k: key, v: value, -) -> List<#(key, value)> { +) -> List<(key, value)> { when elems is { - [] -> [#(k, v)] - [#(k2, v2), ..rest] -> + [] -> [(k, v)] + [(k2, v2), ..rest] -> if k == k2 { - [#(k, v), ..rest] + [(k, v), ..rest] } else { - [#(k2, v2), ..do_insert(rest, k, v)] + [(k2, v2), ..do_insert(rest, k, v)] } } } @@ -41,5 +41,5 @@ fn fixture_1() { } test to_list_2() { - to_list(fixture_1()) == [#("foo", 42), #("bar", 14)] + to_list(fixture_1()) == [("foo", 42), ("bar", 14)] } diff --git a/examples/acceptance_tests/024/lib/tests.ak b/examples/acceptance_tests/024/lib/tests.ak index 5633712f..497ed5cc 100644 --- a/examples/acceptance_tests/024/lib/tests.ak +++ b/examples/acceptance_tests/024/lib/tests.ak @@ -14,5 +14,5 @@ pub fn map2( } test map2_3() { - map2(Some(14), Some(42), fn(a, b) { #(a, b) }) == Some(#(14, 42)) + map2(Some(14), Some(42), fn(a, b) { (a, b) }) == Some((14, 42)) } diff --git a/examples/acceptance_tests/027/lib/tests.ak b/examples/acceptance_tests/027/lib/tests.ak index 87c1a2ba..e9a33709 100644 --- a/examples/acceptance_tests/027/lib/tests.ak +++ b/examples/acceptance_tests/027/lib/tests.ak @@ -1,4 +1,4 @@ -pub fn foo(_a : a) -> Bool { +pub fn foo(_a: a) -> Bool { True } diff --git a/examples/acceptance_tests/029/lib/tests.ak b/examples/acceptance_tests/029/lib/tests.ak index f1da4f1f..6d74cfac 100644 --- a/examples/acceptance_tests/029/lib/tests.ak +++ b/examples/acceptance_tests/029/lib/tests.ak @@ -1,19 +1,19 @@ pub opaque type AssocList { - inner: List<#(key, value)>, + inner: List<(key, value)>, } pub fn new() -> AssocList { AssocList { inner: [] } } -pub fn from_list(xs: List<#(key, value)>) -> AssocList { +pub fn from_list(xs: List<(key, value)>) -> AssocList { AssocList { inner: do_from_list(xs) } } -fn do_from_list(xs: List<#(key, value)>) -> List<#(key, value)> { +fn do_from_list(xs: List<(key, value)>) -> List<(key, value)> { when xs is { [] -> [] - [#(k, v), ..rest] -> do_insert(do_from_list(rest), k, v) + [(k, v), ..rest] -> do_insert(do_from_list(rest), k, v) } } @@ -26,35 +26,35 @@ pub fn insert( } fn do_insert( - elems: List<#(key, value)>, + elems: List<(key, value)>, k: key, v: value, -) -> List<#(key, value)> { +) -> List<(key, value)> { when elems is { - [] -> [#(k, v)] - [#(k2, v2), ..rest] -> + [] -> [(k, v)] + [(k2, v2), ..rest] -> if k == k2 { - [#(k, v), ..rest] + [(k, v), ..rest] } else { - [#(k2, v2), ..do_insert(rest, k, v)] + [(k2, v2), ..do_insert(rest, k, v)] } } } pub fn union( - left left: AssocList, - right right: AssocList, + left: AssocList, + right: AssocList, ) -> AssocList { AssocList { inner: do_union(left.inner, right.inner) } } fn do_union( - left: List<#(key, value)>, - right: List<#(key, value)>, -) -> List<#(key, value)> { + left: List<(key, value)>, + right: List<(key, value)>, +) -> List<(key, value)> { when left is { [] -> right - [#(k, v), ..rest] -> do_union(rest, do_insert(right, k, v)) + [(k, v), ..rest] -> do_union(rest, do_insert(right, k, v)) } } diff --git a/examples/acceptance_tests/032/lib/tests.ak b/examples/acceptance_tests/032/lib/tests.ak index ab4226f1..035686da 100644 --- a/examples/acceptance_tests/032/lib/tests.ak +++ b/examples/acceptance_tests/032/lib/tests.ak @@ -1,12 +1,10 @@ fn is_negative(i: Int) -> Bool { if i < 0 { trace("is negative") - - True + True } else { trace("is non-negative") - - False + False } } diff --git a/examples/acceptance_tests/033/lib/tests.ak b/examples/acceptance_tests/033/lib/tests.ak index ff5e7696..cca7041d 100644 --- a/examples/acceptance_tests/033/lib/tests.ak +++ b/examples/acceptance_tests/033/lib/tests.ak @@ -1,4 +1,4 @@ test tuple_1() { - let coordinates = #(14, 42) + let coordinates = (14, 42) coordinates.1st == 14 && coordinates.2nd == 42 } diff --git a/examples/acceptance_tests/035/lib/aiken/dict.ak b/examples/acceptance_tests/035/lib/aiken/dict.ak index 249ba44f..9640ff8f 100644 --- a/examples/acceptance_tests/035/lib/aiken/dict.ak +++ b/examples/acceptance_tests/035/lib/aiken/dict.ak @@ -1,10 +1,10 @@ /// An opaque `Dict`. The type is opaque because the module maintains some /// invariant, namely: there's only one occurence of a given key in the dictionnary. pub opaque type Dict { - inner: List<#(ByteArray, value)>, + inner: List<(ByteArray, value)>, } -pub fn toList(self: Dict){ +pub fn toList(self: Dict) { self.inner } @@ -20,7 +20,7 @@ pub fn insert( ) -> Dict { Dict { inner: do_insert_with(self.inner, k, v, fn(_, left, _right) { Some(left) })} - + } pub fn union_with( @@ -32,33 +32,33 @@ pub fn union_with( } fn do_union_with( - left: List<#(ByteArray, value)>, - right: List<#(ByteArray, value)>, + left: List<(ByteArray, value)>, + right: List<(ByteArray, value)>, with: fn(ByteArray, value, value) -> Option, -) -> List<#(ByteArray, value)> { +) -> List<(ByteArray, value)> { when left is { [] -> right - [#(k, v), ..rest] -> + [(k, v), ..rest] -> do_union_with(rest, do_insert_with(right, k, v, with), with) } } fn do_insert_with( - self: List<#(ByteArray, value)>, + self: List<(ByteArray, value)>, key k: ByteArray, value v: value, with: fn(ByteArray, value, value) -> Option, -) -> List<#(ByteArray, value)> { +) -> List<(ByteArray, value)> { when self is { - [] -> [#(k, v)] - [#(k2, v2), ..rest] -> + [] -> [(k, v)] + [(k2, v2), ..rest] -> if k == k2 { when with(k, v, v2) is { - Some(combined) -> [#(k, combined), ..rest] + Some(combined) -> [(k, combined), ..rest] None -> rest } } else { - [#(k2, v2), ..do_insert_with(rest, k, v, with)] + [(k2, v2), ..do_insert_with(rest, k, v, with)] } } } diff --git a/examples/acceptance_tests/035/lib/tests.ak b/examples/acceptance_tests/035/lib/tests.ak index ffb5152b..60279bab 100644 --- a/examples/acceptance_tests/035/lib/tests.ak +++ b/examples/acceptance_tests/035/lib/tests.ak @@ -30,18 +30,19 @@ pub fn add(left v0: Value, right v1: Value) -> Value { v0, v1, fn(_, a0, a1) { - let asset = dict.union_with( - a0, - a1, - fn(_, q0, q1) { - let q = q0 + q1 - if q == 0 { - None - } else { - Some(q) - } - }, - ) + let asset = + dict.union_with( + a0, + a1, + fn(_, q0, q1) { + let q = q0 + q1 + if q == 0 { + None + } else { + Some(q) + } + }, + ) when dict.toList(asset) is { [] -> None diff --git a/examples/acceptance_tests/036/aiken.lock b/examples/acceptance_tests/036/aiken.lock index f9eb850a..d9cf5aff 100644 --- a/examples/acceptance_tests/036/aiken.lock +++ b/examples/acceptance_tests/036/aiken.lock @@ -3,11 +3,11 @@ [[requirements]] name = "aiken-lang/stdlib" -version = "6b482fa00ec37fe936c93155e8c670f32288a686" +version = "1cedbe85b7c7e9c4036d63d45cad4ced27b0d50b" source = "github" [[packages]] name = "aiken-lang/stdlib" -version = "6b482fa00ec37fe936c93155e8c670f32288a686" +version = "1cedbe85b7c7e9c4036d63d45cad4ced27b0d50b" requirements = [] source = "github" diff --git a/examples/acceptance_tests/036/aiken.toml b/examples/acceptance_tests/036/aiken.toml index a87271df..bfa5d50c 100644 --- a/examples/acceptance_tests/036/aiken.toml +++ b/examples/acceptance_tests/036/aiken.toml @@ -2,5 +2,5 @@ name = "aiken-lang/acceptance_test_036" version = "0.0.0" dependencies = [ - { name = "aiken-lang/stdlib", version = "6b482fa00ec37fe936c93155e8c670f32288a686", source = "github" }, + { name = "aiken-lang/stdlib", version = "1cedbe85b7c7e9c4036d63d45cad4ced27b0d50b", source = "github" }, ] diff --git a/examples/acceptance_tests/039/lib/tests.ak b/examples/acceptance_tests/039/lib/tests.ak index 2888def8..22b1bc55 100644 --- a/examples/acceptance_tests/039/lib/tests.ak +++ b/examples/acceptance_tests/039/lib/tests.ak @@ -1,60 +1,107 @@ - - - -pub type Door{ +pub type Door { locked: Bool, - hinge_angle: Int + hinge_angle: Int, } - - -pub type Car{ +pub type Car { owner: ByteArray, wheels: Int, door: Door, vin: ByteArray, } - -pub fn update_owner(new_owner: ByteArray, car: Car){ - Car{..car, owner: new_owner} - +pub fn update_owner(new_owner: ByteArray, car: Car) { + Car { ..car, owner: new_owner } } -pub fn update_vin(new_vin: ByteArray, car: Car){ - Car{..car, vin: new_vin} +pub fn update_vin(new_vin: ByteArray, car: Car) { + Car { ..car, vin: new_vin } } - -pub fn update_door_angle(new_hinge_angle: Int, car: Car){ - Car{..car, door: Door{..car.door, hinge_angle: new_hinge_angle}} +pub fn update_door_angle(new_hinge_angle: Int, car: Car) { + Car { ..car, door: Door { ..car.door, hinge_angle: new_hinge_angle } } } -pub fn update_door_locked_and_wheels(new_locked: Bool, new_wheels: Int, car: Car){ - Car{..car, door: Door{..car.door, locked: new_locked}, wheels: new_wheels} - +pub fn update_door_locked_and_wheels( + new_locked: Bool, + new_wheels: Int, + car: Car, +) { + Car { + ..car, + door: Door { ..car.door, locked: new_locked }, + wheels: new_wheels, + } } -test update_owner1(){ - let initial_car = Car{owner: #[], wheels: 4, vin: #[1,1,1,1,1,1,1], door: Door{locked: False, hinge_angle: 45}} - let final_car = Car{owner: #[244, 244, 244, 244], wheels: 4, vin: #[1,1,1,1,1,1,1], door: Door{locked: False, hinge_angle: 45}} +test update_owner1() { + let initial_car = + Car { + owner: #[], + wheels: 4, + vin: #[1, 1, 1, 1, 1, 1, 1], + door: Door { locked: False, hinge_angle: 45 }, + } + let final_car = + Car { + owner: #[244, 244, 244, 244], + wheels: 4, + vin: #[1, 1, 1, 1, 1, 1, 1], + door: Door { locked: False, hinge_angle: 45 }, + } update_owner(#[244, 244, 244, 244], initial_car) == final_car } -test update_vin1(){ - let initial_car = Car{owner: #[], wheels: 4, vin: #[1,1,1,1,1,1,1], door: Door{locked: False, hinge_angle: 45}} - let final_car = Car{owner: #[], wheels: 4, vin: #[2,2,2,2,2,2,2,2,2], door: Door{locked: False, hinge_angle: 45}} - update_vin(#[2,2,2,2,2,2,2,2,2], initial_car) == final_car +test update_vin1() { + let initial_car = + Car { + owner: #[], + wheels: 4, + vin: #[1, 1, 1, 1, 1, 1, 1], + door: Door { locked: False, hinge_angle: 45 }, + } + let final_car = + Car { + owner: #[], + wheels: 4, + vin: #[2, 2, 2, 2, 2, 2, 2, 2, 2], + door: Door { locked: False, hinge_angle: 45 }, + } + update_vin(#[2, 2, 2, 2, 2, 2, 2, 2, 2], initial_car) == final_car } -test update_door_angle1(){ - let initial_car = Car{owner: #[], wheels: 4, vin: #[1,1,1,1,1,1,1], door: Door{locked: False, hinge_angle: 45}} - let final_car = Car{owner: #[], wheels: 4, vin: #[1,1,1,1,1,1,1], door: Door{locked: False, hinge_angle: 90}} +test update_door_angle1() { + let initial_car = + Car { + owner: #[], + wheels: 4, + vin: #[1, 1, 1, 1, 1, 1, 1], + door: Door { locked: False, hinge_angle: 45 }, + } + let final_car = + Car { + owner: #[], + wheels: 4, + vin: #[1, 1, 1, 1, 1, 1, 1], + door: Door { locked: False, hinge_angle: 90 }, + } update_door_angle(90, initial_car) == final_car } -test update_door_locked_and_wheels1(){ - let initial_car = Car{owner: #[], wheels: 4, vin: #[1,1,1,1,1,1,1], door: Door{locked: False, hinge_angle: 45}} - let final_car = Car{owner: #[], wheels: 5, vin: #[1,1,1,1,1,1,1], door: Door{locked: True, hinge_angle: 45}} +test update_door_locked_and_wheels1() { + let initial_car = + Car { + owner: #[], + wheels: 4, + vin: #[1, 1, 1, 1, 1, 1, 1], + door: Door { locked: False, hinge_angle: 45 }, + } + let final_car = + Car { + owner: #[], + wheels: 5, + vin: #[1, 1, 1, 1, 1, 1, 1], + door: Door { locked: True, hinge_angle: 45 }, + } update_door_locked_and_wheels(True, 5, initial_car) == final_car }