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))) }
 | |
| })
 | |
| 
 | 
