add generics

This commit is contained in:
paul committed 2026-10-23 02:13:30 -04:00
1 parent 79533e9537
commit 2204d58102
22 files changed
+47358 -37579

No files matched your search

+240 -16
View File
@@ -36,7 +36,7 @@ Point :: &{
y: i32 = 0
}
point := &Point.{ x: 1; y = 2 }
maybe: []{i32?}: [nil, some 1]
maybe: []{i32?}: [|.none, 1->|.some]
---
@@ -73,11 +73,16 @@ maybe: []{i32?}: [nil, some 1]
(primitive_type))))
(collection_literal
(collection_entry
(nil_literal))
(sum_constructor
(identifier)))
(collection_entry
(unary_expression
(pipeline_expression
(signed_numeric_literal
(integer_literal)))))))
(integer_literal))
(direct_pipeline_stage
(pipeline_callable
(sum_constructor
(identifier)))))))))
==================
Control flow and patterns
@@ -302,17 +307,17 @@ unit :: @ () -> i32 { 42 }
Optional and result wrappers
==================
wrap :: @ value: i32 -> i32 ! str { ok value }
wrap :: @ value: i32 -> i32 ! str { value->|.ok }
first :: @ items: []i32 -> i32? {
match items {
[] => nil
[head, ...rest] => some head
[] => |.none
[head, ...rest] => head->|.some
}
}
unwrap :: @ result: i32 ! str -> i32 {
match result {
ok value => value
err _ => 0
|.ok value => value
|.err _ => 0
}
}
@@ -329,8 +334,12 @@ unwrap :: @ result: i32 ! str -> i32 {
(primitive_type)
(primitive_type))
(block
(unary_expression
(identifier)))))
(pipeline_expression
(identifier)
(direct_pipeline_stage
(pipeline_callable
(sum_constructor
(identifier))))))))
(declaration
(identifier)
(function_literal
@@ -346,7 +355,8 @@ unwrap :: @ result: i32 ! str -> i32 {
(match_arm
(pattern
(array_pattern))
(nil_literal))
(sum_constructor
(identifier)))
(match_arm
(pattern
(array_pattern
@@ -355,8 +365,12 @@ unwrap :: @ result: i32 ! str -> i32 {
(identifier)))
(array_pattern_entry
(identifier))))
(unary_expression
(identifier)))))))
(pipeline_expression
(identifier)
(direct_pipeline_stage
(pipeline_callable
(sum_constructor
(identifier))))))))))
(declaration
(identifier)
(function_literal
@@ -371,12 +385,14 @@ unwrap :: @ result: i32 ! str -> i32 {
(identifier)
(match_arm
(pattern
(wrapper_pattern
(sum_pattern
(identifier)
(identifier)))
(identifier))
(match_arm
(pattern
(wrapper_pattern))
(sum_pattern
(identifier)))
(signed_numeric_literal
(integer_literal))))))))
@@ -433,3 +449,211 @@ mixed :: @ (left: i32, right) -> i32 { left + right }
(binary_expression
(identifier)
(identifier))))))
==================
Postfix pipeline stages
==================
mixed :: -3->add_ten + 2 * 3->double - {1 + 1}->double
checked :: not c->is_digit
unwrapped :: input->fallible?->next
---
(source_file
(declaration
(identifier)
(binary_expression
(binary_expression
(unary_expression
(pipeline_expression
(signed_numeric_literal
(integer_literal))
(direct_pipeline_stage
(pipeline_callable
(identifier)))))
(binary_expression
(signed_numeric_literal
(integer_literal))
(pipeline_expression
(signed_numeric_literal
(integer_literal))
(direct_pipeline_stage
(pipeline_callable
(identifier))))))
(pipeline_expression
(block
(binary_expression
(signed_numeric_literal
(integer_literal))
(signed_numeric_literal
(integer_literal))))
(direct_pipeline_stage
(pipeline_callable
(identifier))))))
(declaration
(identifier)
(unary_expression
(pipeline_expression
(identifier)
(direct_pipeline_stage
(pipeline_callable
(identifier))))))
(declaration
(identifier)
(pipeline_expression
(identifier)
(direct_pipeline_stage
(pipeline_callable
(identifier)))
(direct_pipeline_stage
(pipeline_callable
(identifier))))))
==================
Continuations after same-line stages
==================
flat := value->first->second
->third
whole := a + b->f
->g
---
(source_file
(declaration
(identifier)
(pipeline_expression
(identifier)
(direct_pipeline_stage
(pipeline_callable
(identifier)))
(direct_pipeline_stage
(pipeline_callable
(identifier)))
(continuation_pipeline_stage
(pipeline_callable
(identifier)))))
(declaration
(identifier)
(pipeline_expression
(binary_expression
(identifier)
(pipeline_expression
(identifier)
(direct_pipeline_stage
(pipeline_callable
(identifier)))))
(continuation_pipeline_stage
(pipeline_callable
(identifier))))))
==================
Generic binders and constraints
==================
Show :: <>{
to_str: str
...Display
}
pick: <T: Show, (T, T): Ordered> (T, T) -> T: @ (first, second): (T, T) { first }
Card :: &{ label: Output<make_label: Show>: }
---
(source_file
(declaration
(identifier)
(type_definition
(constraint_body
(constraint_entry
(identifier)
(primitive_type))
(constraint_spread
(identifier)))))
(declaration
(identifier)
(binder
(binder_entry
(identifier)
(identifier))
(binder_entry
(tuple_type
(identifier)
(identifier))
(identifier)))
(function_type
(tuple_type
(identifier)
(identifier))
(identifier))
(function_literal
(typed_parameter
(tuple_pattern
(pattern
(identifier))
(pattern
(identifier)))
(tuple_type
(identifier)
(identifier)))
(block
(identifier))))
(declaration
(identifier)
(type_definition
(product_type
(product_field
(identifier)
(output_type
(identifier)
(identifier)
(identifier)))))))
==================
Import filters
==================
use math.{sqrt for f64, pi as p}
use .shapes.area for Circle
pub { area for Circle; sqrt }
---
(source_file
(use_declaration
(module_path
(identifier))
(import_member
(identifier)
(import_filter
(primitive_type)))
(import_member
(identifier)
(identifier)))
(use_declaration
(module_path
(qualified_name
(identifier)
(identifier)))
(import_filter
(identifier)))
(pub_declaration
(pub_entry
(identifier)
(import_filter
(identifier)))
(pub_entry
(identifier))))
==================
Reserved word
:error
==================
context := 1
---