# Concrete ## ROADMAP ## TODO - vean el tema de pasar funcinoes como argumentos tmb y metamoslo en el roadmap junto a closures ## Examples ### Learn X in Y minutes where X=Concrete ``` // this is a single line comment /* this is a multi line comment */ /// this is a doc comment mod ModuleName { import Module.type; import Module.function; import { Module1.function1, Module2.function2, } struct MyStruct{ field1: u8 field2: bool } enum MyEnum{ Variant0, TupleVariant(bool), StructVariant{ field1: u16, }, } pub fn main() { const let v1: u8; // variable declaration v1 = 42; let v2 = my_function(); } fn my_function() { } fn my_function2() -> u8 { 42 } fn my_function3() -> u8 { return 42 } // a closure that adds 1. let add1: (i8 -> i8) = (x: i8) -> x + 1; } ``` ### Fibonacci ``` mod FibonacciModule { pub fib(x: u64) -> u64 { match x { // we can match literal values 0 | 1 -> x, n -> fib(n-1) + fib(n-2) } } } ``` ### Factorial ``` mod FactorialModule { // unsigned integer types: u8, u16,... // signed integer types: i8, i16, ... pub fn factorial(x: u64) -> u64 { // match is an expression, so it returns // the value of its evaluation match x { 0 -> 1, n -> n * factorial(n-1), } } pub main() { factorial(10) } } ``` ### Sum ``` mod Sum { /// Returns the sum of a vector of numbers. fn sum(x: [i8]) -> i8 { x.reduce(0, (x: i8, y: i8) -> x + y) } } ``` ## 0.1.0 ### Vec ### Map ### Option ``` mod Option { pub enum Option<T> { None, Some(T), } pub fn map<A, B>(opt: Option<A>, f: A -> B) -> Option<B> { match opt { None -> None, Some(x) -> Some(f(x)), } } } mod UsesOption { import MyOption.{Option, map}; pub fn headOfVectorPlus1(x: [u8]) -> Option<u8> { // head returns an option x.head().map((x: u8) -> x + 1) } } ``` ### Result