2069f7371540d71d767c194e5c9dd66ebb908870
				
			
			
		
	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;
]
					Languages
				
				
								
								
									Rust
								
								56.2%
							
						
							
								
								
									Yacc
								
								36.9%
							
						
							
								
								
									Lex
								
								6.9%