| 
									
										
										
										
											2009-03-30 06:31:50 -04:00
										 |  |  | ! Copyright (C) 2009 Slava Pestov. | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2009-03-31 02:24:38 -04:00
										 |  |  | USING: assocs kernel accessors quotations slots words | 
					
						
							|  |  |  | sequences namespaces combinators combinators.short-circuit | 
					
						
							| 
									
										
										
										
											2009-03-31 22:23:09 -04:00
										 |  |  | summary smalltalk.classes ;
 | 
					
						
							| 
									
										
										
										
											2009-03-30 06:31:50 -04:00
										 |  |  | IN: smalltalk.compiler.lexenv | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-30 21:45:01 -04:00
										 |  |  | ! local-readers: assoc string => word | 
					
						
							|  |  |  | ! local-writers: assoc string => word | 
					
						
							|  |  |  | ! self: word or f for top-level forms | 
					
						
							|  |  |  | ! class: class word or f for top-level forms | 
					
						
							|  |  |  | ! method: generic word or f for top-level forms | 
					
						
							| 
									
										
										
										
											2009-04-01 03:47:51 -04:00
										 |  |  | TUPLE: lexenv local-readers local-writers self return class method ;
 | 
					
						
							| 
									
										
										
										
											2009-03-30 06:31:50 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-31 02:24:38 -04:00
										 |  |  | : <lexenv> ( -- lexenv ) lexenv new ; inline
 | 
					
						
							| 
									
										
										
										
											2009-03-30 06:31:50 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | CONSTANT: empty-lexenv T{ lexenv } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : lexenv-union ( lexenv1 lexenv2 -- lexenv )
 | 
					
						
							| 
									
										
										
										
											2009-03-31 02:24:38 -04:00
										 |  |  |     [ <lexenv> ] 2dip { | 
					
						
							|  |  |  |         [ [ local-readers>> ] bi@ assoc-union >>local-readers ] | 
					
						
							|  |  |  |         [ [ local-writers>> ] bi@ assoc-union >>local-writers ] | 
					
						
							|  |  |  |         [ [ self>> ] either? >>self ] | 
					
						
							| 
									
										
										
										
											2009-04-01 03:47:51 -04:00
										 |  |  |         [ [ return>> ] either? >>return ] | 
					
						
							| 
									
										
										
										
											2009-03-31 02:24:38 -04:00
										 |  |  |         [ [ class>> ] either? >>class ] | 
					
						
							|  |  |  |         [ [ method>> ] either? >>method ] | 
					
						
							|  |  |  |     } 2cleave ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : local-reader ( name lexenv -- local )
 | 
					
						
							|  |  |  |     local-readers>> at dup [ 1quotation ] when ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : ivar-reader ( name lexenv -- quot/f )
 | 
					
						
							|  |  |  |     dup class>> [ | 
					
						
							|  |  |  |         [ class>> "slots" word-prop slot-named ] [ self>> ] bi
 | 
					
						
							|  |  |  |         swap dup [ name>> reader-word [ ] 2sequence ] [ 2drop f ] if
 | 
					
						
							|  |  |  |     ] [ 2drop f ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : class-name ( name -- quot/f )
 | 
					
						
							|  |  |  |     classes get at dup [ [ ] curry ] when ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ERROR: bad-identifier name ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-31 22:23:09 -04:00
										 |  |  | M: bad-identifier summary drop "Unknown identifier" ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-31 02:24:38 -04:00
										 |  |  | : lookup-reader ( name lexenv -- reader-quot )
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         [ local-reader ] | 
					
						
							|  |  |  |         [ ivar-reader ] | 
					
						
							|  |  |  |         [ drop class-name ] | 
					
						
							|  |  |  |         [ drop bad-identifier ] | 
					
						
							|  |  |  |     } 2|| ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : local-writer ( name lexenv -- local )
 | 
					
						
							|  |  |  |     local-writers>> at dup [ 1quotation ] when ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : ivar-writer ( name lexenv -- quot/f )
 | 
					
						
							|  |  |  |     dup class>> [ | 
					
						
							|  |  |  |         [ class>> "slots" word-prop slot-named ] [ self>> ] bi
 | 
					
						
							|  |  |  |         swap dup [ name>> writer-word [ ] 2sequence ] [ 2drop f ] if
 | 
					
						
							|  |  |  |     ] [ 2drop f ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : lookup-writer ( name lexenv -- writer-quot )
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         [ local-writer ] | 
					
						
							|  |  |  |         [ ivar-writer ] | 
					
						
							|  |  |  |         [ drop bad-identifier ] | 
					
						
							|  |  |  |     } 2|| ;
 |