52 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			52 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # fudge2
 | |
| 
 | |
| second iteration of the fudge language
 | |
| 
 | |
| ## example program
 | |
| ```asm
 | |
| 
 | |
| // 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;
 | |
| ]
 | |
| 
 | |
| ``` |