79 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			79 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Factor
		
	
	
| 
								 | 
							
								USING: arrays lazy-lists io strings sequences math namespaces
							 | 
						||
| 
								 | 
							
								kernel ;
							 | 
						||
| 
								 | 
							
								IN: lambda
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: lambda-core ( -- expr-string-array )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        ":0 (one.(zero.zero))"
							 | 
						||
| 
								 | 
							
								        ":SUCC (num.(one.(zero.(one((num one) zero)))))"
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    0 lfrom 100 swap ltake list>array
							 | 
						||
| 
								 | 
							
								    [ 
							 | 
						||
| 
								 | 
							
								        [ ":" , dup 1 + number>string , " (SUCC " , number>string ,
							 | 
						||
| 
								 | 
							
								        ")" , ] { } make concat
							 | 
						||
| 
								 | 
							
								    ] map append
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    0 lfrom 26 swap ltake list>array
							 | 
						||
| 
								 | 
							
								    [
							 | 
						||
| 
								 | 
							
								        [ ":" , 65 + dup 1string , " " , number>string , ] { } make concat
							 | 
						||
| 
								 | 
							
								    ] map append
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        ":LF 10"
							 | 
						||
| 
								 | 
							
								        ":FALSE (t.(f.f))"
							 | 
						||
| 
								 | 
							
								        ":TRUE (t.(f.t))"
							 | 
						||
| 
								 | 
							
								        ":AND (p.(q.((p q) FALSE)))"
							 | 
						||
| 
								 | 
							
								        ":OR (p.(q.((p TRUE) q)))"
							 | 
						||
| 
								 | 
							
								        ":ISZERO (num.((num (pred. FALSE)) TRUE))"
							 | 
						||
| 
								 | 
							
								        ":ADD (num.(other.((num SUCC) other)))"
							 | 
						||
| 
								 | 
							
								        ":MULT (num.(other.((num (ADD other)) 0)))"
							 | 
						||
| 
								 | 
							
								        ":PRED (n.(f.(x.(((n (g.(h.(h(g f))))) (u. x)) (u.u)))))"
							 | 
						||
| 
								 | 
							
								        ":SUBFROM (num.(other.((num PRED) other)))"
							 | 
						||
| 
								 | 
							
								        ":EQUAL (num.(other.((AND (ISZERO ((SUBFROM num) other))) (ISZERO ((SUBFROM other) num)))))"
							 | 
						||
| 
								 | 
							
								        ":FACT (fact.(num.(((ISZERO num) 1) ((MULT num) (fact (PRED num))))))"
							 | 
						||
| 
								 | 
							
								        ":YCOMBINATOR (func.((y. (func (y y)))(y. (func (y y)))))"
							 | 
						||
| 
								 | 
							
								        ":FACTORIAL (YCOMBINATOR FACT)"
							 | 
						||
| 
								 | 
							
								        ":CONS (car.(cdr.(which.((which car) cdr))))"
							 | 
						||
| 
								 | 
							
								        ":CAR (cons.(cons TRUE))"
							 | 
						||
| 
								 | 
							
								        ":CDR (cons.(cons FALSE))"
							 | 
						||
| 
								 | 
							
								        ":PCONS (pcons.(num.(cons.(((ISZERO num) (PRINTSPECIAL LF)) ((PRINTCHAR (CAR cons)) ((pcons (PRED num)) (CDR cons)))))))"
							 | 
						||
| 
								 | 
							
								        ":PRINTCONS (YCOMBINATOR PCONS)"
							 | 
						||
| 
								 | 
							
								        ":NUMTOCHAR (num. ((ADD 48) num))"
							 | 
						||
| 
								 | 
							
								        ":PRINTNUM (num.(PRINTCHAR (NUMTOCHAR num)))"
							 | 
						||
| 
								 | 
							
								        ":PRINTCHAR (char.([PRINTCHAR] (ALIENNUM char)))"
							 | 
						||
| 
								 | 
							
								        ":PRINTSPECIAL (special.([PRINTCHAR] (ALIENNUM special)))"
							 | 
						||
| 
								 | 
							
								        ":ALIEN0 alienbaseonenum"
							 | 
						||
| 
								 | 
							
								        ":ALIENNUM (num.((num [ALIENSUCC]) ALIEN0))"
							 | 
						||
| 
								 | 
							
								        ":HELLOCONS ((CONS H) ((CONS E) ((CONS Y) ((CONS 0) nil))))"
							 | 
						||
| 
								 | 
							
								        ":HELLO ((PRINTCONS 3) HELLOCONS)"
							 | 
						||
| 
								 | 
							
								        "(([HELLO] nil) ([INFO] nil))"
							 | 
						||
| 
								 | 
							
								    } append ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: print-return ( -- node )
							 | 
						||
| 
								 | 
							
								    write "(nil.nil)" lambda-parse second ;
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								: HELLO ( node -- node )
							 | 
						||
| 
								 | 
							
								    drop "\nHello and Welcome to Lambda!\n" print-return ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: INFO ( node -- node )
							 | 
						||
| 
								 | 
							
								    drop "Type HELLO and wait 10 seconds to see me flex my io muscles.\n" print-return ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: ALIENSUCC ( node -- node )
							 | 
						||
| 
								 | 
							
								    var-node-name "a" append <var-node> ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: ALIENPRED ( node -- node )
							 | 
						||
| 
								 | 
							
								    var-node-name 1 tail <var-node> ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: ALIENISZERO ( node -- node )
							 | 
						||
| 
								 | 
							
								    ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: PRINTCHAR ( node -- node )
							 | 
						||
| 
								 | 
							
								    #! takes a base one num and prints its char equivalent
							 | 
						||
| 
								 | 
							
								    var-node-name length "alienbaseonenum" length - 1string print-return ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: READCHAR ( node -- node )
							 | 
						||
| 
								 | 
							
								    #! reads one character of input and stores it as a base one num
							 | 
						||
| 
								 | 
							
								    "alienbaseonenum" read1 "a" <array> >string <var-node> ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    
							 |