1.2 KiB
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;
]