Files
fudge2.1/README.md
2025-10-30 19:12:04 +01:00

1.2 KiB

fudge2

second iteration of the fudge language

example program


// Map, Filter, Reduce
sig map := (T => U) => #iterable(T) => #iterable(U) 
let map f ls := match ls | (x:xs) => (f x: map f xs)
                         | [] => []     

// Side Effects are ugly, C-FFI
sig polluting map := #polluting (Maybe T => U) => Iterable(T) => Nothing
let polluting map f [ls] :=
    using std/c-ffi/guarantee_no_parallel_map as seqmap
{
    seqmap 0 (len ls) (i => f (ls at i))
}

// type traits
sig polluting print := #repr T => Result (Nothing, #error io_error)
let polluting print s := using std/io/write, std/io/stdout {
    write stdout (Repr s)
}

// Overloading?
sig polluting print := Iterable (#repr T) => Result (Nothing, #error io_error)
let polluting print #repr ls := using std\io as io {
    map print ls
}

// Generic types
sig add := T => T => T
let add a b := a + b

// Partial application
sig inc := T => T
let inc a = add a 1

// Evaluate a polluting expression
sig polluting do := #polluting T => Nothing

@data := struct (
    let arr := Array(0..100) :> inc,
    let ls := List(0..100) :> (x=>x*x),
    let all := arr ++ ls,
)
@main := do print @data/all;
]