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