28 lines
		
	
	
		
			918 B
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			28 lines
		
	
	
		
			918 B
		
	
	
	
		
			Factor
		
	
	
|  | #! An interpreter for lambda expressions, by Matthew Willis | ||
|  | USING: io strings hashtables sequences namespaces kernel ;
 | ||
|  | IN: lambda | ||
|  | 
 | ||
|  | : lambda-print ( name/expr -- )
 | ||
|  |     dup string?  | ||
|  |     [   dup lambda-names get hash expr>string " " swap  | ||
|  |         append append "DEF " swap append  | ||
|  |     ] [ expr>string "=> " swap append  | ||
|  |     ] if print flush ;
 | ||
|  | 
 | ||
|  | : lambda-define ( parse-result -- name/expr )
 | ||
|  |     #! Make sure not to evaluate definitions. | ||
|  |     first2 over [ over lambda-names get set-hash ] [ nip ] if ;
 | ||
|  | 
 | ||
|  | : lambda-eval ( name/expr -- name/expr )
 | ||
|  |     dup string? [ normalize ] unless ;
 | ||
|  | 
 | ||
|  | : lambda-boot ( -- )
 | ||
|  |     #! load the core lambda library | ||
|  |     H{ } clone lambda-names set lambda-core | ||
|  |     [ lambda-parse lambda-define lambda-eval lambda-print ] each ;
 | ||
|  |   | ||
|  | : lambda ( -- )
 | ||
|  |     lambda-names get [ lambda-boot ] unless
 | ||
|  |     readln dup "." = [ drop ] [ | ||
|  |         lambda-parse lambda-define lambda-eval lambda-print lambda | ||
|  |     ] if ;
 |