67 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Factor
		
	
	
| ! Copyright (C) 2009 Slava Pestov.
 | |
| ! See http://factorcode.org/license.txt for BSD license.
 | |
| USING: assocs kernel accessors quotations slots words
 | |
| sequences namespaces combinators combinators.short-circuit
 | |
| summary smalltalk.classes ;
 | |
| IN: smalltalk.compiler.lexenv
 | |
| 
 | |
| ! 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
 | |
| TUPLE: lexenv local-readers local-writers self return class method ;
 | |
| 
 | |
| : <lexenv> ( -- lexenv ) lexenv new ; inline
 | |
| 
 | |
| CONSTANT: empty-lexenv T{ lexenv }
 | |
| 
 | |
| : lexenv-union ( lexenv1 lexenv2 -- lexenv )
 | |
|     [ <lexenv> ] 2dip {
 | |
|         [ [ local-readers>> ] bi@ assoc-union >>local-readers ]
 | |
|         [ [ local-writers>> ] bi@ assoc-union >>local-writers ]
 | |
|         [ [ self>> ] either? >>self ]
 | |
|         [ [ return>> ] either? >>return ]
 | |
|         [ [ 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 ;
 | |
| 
 | |
| M: bad-identifier summary drop "Unknown identifier" ;
 | |
| 
 | |
| : 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|| ; |