240 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			240 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | ;;; | ||
|  | ;;;   Lispy Standard Prelude | ||
|  | ;;; | ||
|  | 
 | ||
|  | ;;; Atoms | ||
|  | (def {nil} {}) | ||
|  | (def {true} 1) | ||
|  | (def {false} 0) | ||
|  | 
 | ||
|  | ;;; Functional Functions | ||
|  | 
 | ||
|  | ; Function Definitions | ||
|  | (def {fun} (\ {f b} { | ||
|  |   def (head f) (\ (tail f) b) | ||
|  | })) | ||
|  | 
 | ||
|  | ; Open new scope | ||
|  | (fun {let b} { | ||
|  |   ((\ {_} b) ()) | ||
|  | }) | ||
|  | 
 | ||
|  | ; Unpack List to Function | ||
|  | (fun {unpack f l} { | ||
|  |   eval (join (list f) l) | ||
|  | }) | ||
|  | 
 | ||
|  | ; Unapply List to Function | ||
|  | (fun {pack f & xs} {f xs}) | ||
|  | 
 | ||
|  | ; Curried and Uncurried calling | ||
|  | (def {curry} {unpack}) | ||
|  | (def {uncurry} {pack}) | ||
|  | 
 | ||
|  | ; Perform Several things in Sequence | ||
|  | (fun {do & l} { | ||
|  |   if (== l {}) | ||
|  |     {{}} | ||
|  |     {last l} | ||
|  | }) | ||
|  | 
 | ||
|  | ;;; Logical Functions | ||
|  | 
 | ||
|  | ; Logical Functions | ||
|  | (fun {not x}   {- 1 x}) | ||
|  | (fun {or x y}  {+ x y}) | ||
|  | (fun {and x y} {* x y}) | ||
|  | 
 | ||
|  | 
 | ||
|  | ;;; Numeric Functions | ||
|  | 
 | ||
|  | ; Minimum of Arguments | ||
|  | (fun {min & xs} { | ||
|  |   if (== (tail xs) {}) {fst xs} | ||
|  |     {do  | ||
|  |       (= {rest} (unpack min (tail xs))) | ||
|  |       (= {item} (fst xs)) | ||
|  |       (if (< item rest) {item} {rest}) | ||
|  |     } | ||
|  | }) | ||
|  | 
 | ||
|  | ; Minimum of Arguments | ||
|  | (fun {max & xs} { | ||
|  |   if (== (tail xs) {}) {fst xs} | ||
|  |     {do  | ||
|  |       (= {rest} (unpack max (tail xs))) | ||
|  |       (= {item} (fst xs)) | ||
|  |       (if (> item rest) {item} {rest}) | ||
|  |     }   | ||
|  | }) | ||
|  | 
 | ||
|  | ;;; Conditional Functions | ||
|  | 
 | ||
|  | (fun {select & cs} { | ||
|  |   if (== cs {}) | ||
|  |     {error "No Selection Found"} | ||
|  |     {if (fst (fst cs)) {snd (fst cs)} {unpack select (tail cs)}} | ||
|  | }) | ||
|  | 
 | ||
|  | (fun {case x & cs} { | ||
|  |   if (== cs {}) | ||
|  |     {error "No Case Found"} | ||
|  |     {if (== x (fst (fst cs))) {snd (fst cs)} {unpack case (join (list x) (tail cs))}} | ||
|  | }) | ||
|  | 
 | ||
|  | (def {otherwise} true) | ||
|  | 
 | ||
|  | 
 | ||
|  | ;;; Misc Functions | ||
|  | 
 | ||
|  | (fun {flip f a b} {f b a}) | ||
|  | (fun {ghost & xs} {eval xs}) | ||
|  | (fun {comp f g x} {f (g x)}) | ||
|  | 
 | ||
|  | ;;; List Functions | ||
|  | 
 | ||
|  | ; First, Second, or Third Item in List | ||
|  | (fun {fst l} { eval (head l) }) | ||
|  | (fun {snd l} { eval (head (tail l)) }) | ||
|  | (fun {trd l} { eval (head (tail (tail l))) }) | ||
|  | 
 | ||
|  | ; List Length | ||
|  | (fun {len l} { | ||
|  |   if (== l {}) | ||
|  |     {0} | ||
|  |     {+ 1 (len (tail l))} | ||
|  | }) | ||
|  | 
 | ||
|  | ; Nth item in List | ||
|  | (fun {nth n l} { | ||
|  |   if (== n 0) | ||
|  |     {fst l} | ||
|  |     {nth (- n 1) (tail l)} | ||
|  | }) | ||
|  | 
 | ||
|  | ; Last item in List | ||
|  | (fun {last l} {nth (- (len l) 1) l}) | ||
|  | 
 | ||
|  | ; Apply Function to List | ||
|  | (fun {map f l} { | ||
|  |   if (== l {}) | ||
|  |     {{}} | ||
|  |     {join (list (f (fst l))) (map f (tail l))} | ||
|  | }) | ||
|  | 
 | ||
|  | ; Apply Filter to List | ||
|  | (fun {filter f l} { | ||
|  |   if (== l {}) | ||
|  |     {{}} | ||
|  |     {join (if (f (fst l)) {head l} {{}}) (filter f (tail l))} | ||
|  | }) | ||
|  | 
 | ||
|  | ; Return all of list but last element | ||
|  | (fun {init l} { | ||
|  |   if (== (tail l) {}) | ||
|  |     {{}} | ||
|  |     {join (head l) (init (tail l))} | ||
|  | }) | ||
|  | 
 | ||
|  | ; Reverse List | ||
|  | (fun {reverse l} { | ||
|  |   if (== l {}) | ||
|  |     {{}} | ||
|  |     {join (reverse (tail l)) (head l)} | ||
|  | }) | ||
|  | 
 | ||
|  | ; Fold Left | ||
|  | (fun {foldl f z l} { | ||
|  |   if (== l {})  | ||
|  |     {z} | ||
|  |     {foldl f (f z (fst l)) (tail l)} | ||
|  | }) | ||
|  | 
 | ||
|  | ; Fold Right | ||
|  | (fun {foldr f z l} { | ||
|  |   if (== l {})  | ||
|  |     {z} | ||
|  |     {f (fst l) (foldr f z (tail l))} | ||
|  | }) | ||
|  | 
 | ||
|  | (fun {sum l} {foldl + 0 l}) | ||
|  | (fun {product l} {foldl * 1 l}) | ||
|  | 
 | ||
|  | ; Take N items | ||
|  | (fun {take n l} { | ||
|  |   if (== n 0) | ||
|  |     {{}} | ||
|  |     {join (head l) (take (- n 1) (tail l))} | ||
|  | }) | ||
|  | 
 | ||
|  | ; Drop N items | ||
|  | (fun {drop n l} { | ||
|  |   if (== n 0) | ||
|  |     {l} | ||
|  |     {drop (- n 1) (tail l)} | ||
|  | }) | ||
|  | 
 | ||
|  | ; Split at N | ||
|  | (fun {split n l} {list (take n l) (drop n l)}) | ||
|  | 
 | ||
|  | ; Take While | ||
|  | (fun {take-while f l} { | ||
|  |   if (not (unpack f (head l))) | ||
|  |     {{}} | ||
|  |     {join (head l) (take-while f (tail l))} | ||
|  | }) | ||
|  | 
 | ||
|  | ; Drop While | ||
|  | (fun {drop-while f l} { | ||
|  |   if (not (unpack f (head l))) | ||
|  |     {l} | ||
|  |     {drop-while f (tail l)} | ||
|  | }) | ||
|  | 
 | ||
|  | ; Element of List | ||
|  | (fun {elem x l} { | ||
|  |   if (== l {}) | ||
|  |     {false} | ||
|  |     {if (== x (fst l)) {true} {elem x (tail l)}} | ||
|  | }) | ||
|  | 
 | ||
|  | ; Find element in list of pairs | ||
|  | (fun {lookup x l} { | ||
|  |   if (== l {}) | ||
|  |     {error "No Element Found"} | ||
|  |     {do | ||
|  |       (= {key} (fst (fst l))) | ||
|  |       (= {val} (snd (fst l))) | ||
|  |       (if (== key x) {val} {lookup x (tail l)}) | ||
|  |     } | ||
|  | }) | ||
|  | 
 | ||
|  | ; Zip two lists together into a list of pairs | ||
|  | (fun {zip x y} { | ||
|  |   if (or (== x {}) (== y {})) | ||
|  |     {{}} | ||
|  |     {join (list (join (head x) (head y))) (zip (tail x) (tail y))} | ||
|  | }) | ||
|  | 
 | ||
|  | ; Unzip a list of pairs into two lists | ||
|  | (fun {unzip l} { | ||
|  |   if (== l {}) | ||
|  |     {{{} {}}} | ||
|  |     {do | ||
|  |       (= {x} (fst l)) | ||
|  |       (= {xs} (unzip (tail l))) | ||
|  |       (list (join (head x) (fst xs)) (join (tail x) (snd xs))) | ||
|  |     } | ||
|  | }) | ||
|  | 
 | ||
|  | ;;; Other Fun | ||
|  | 
 | ||
|  | ; Fibonacci | ||
|  | (fun {fib n} { | ||
|  |   select | ||
|  |     { (== n 0) 0 } | ||
|  |     { (== n 1) 1 } | ||
|  |     { otherwise (+ (fib (- n 1)) (fib (- n 2))) } | ||
|  | }) | ||
|  | 
 |