| 
									
										
										
										
											2025-10-22 12:54:59 +02:00
										 |  |  | # fudge2
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-10-30 19:12:04 +01:00
										 |  |  | 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; | 
					
						
							|  |  |  | ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ``` |