60 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Factor
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Factor
		
	
	
		
			Executable File
		
	
| ! Copyright (C) 2004, 2008 Slava Pestov.
 | |
| ! See http://factorcode.org/license.txt for BSD license.
 | |
| USING: classes classes.algebra kernel namespaces words sequences
 | |
| quotations arrays kernel.private assocs combinators ;
 | |
| IN: classes.predicate
 | |
| 
 | |
| PREDICATE: predicate-class < class
 | |
|     "metaclass" word-prop predicate-class eq? ;
 | |
| 
 | |
| DEFER: predicate-instance? ( object class -- ? )
 | |
| 
 | |
| : update-predicate-instance ( -- )
 | |
|     \ predicate-instance? bootstrap-word
 | |
|     classes [ predicate-class? ] filter [
 | |
|         [ literalize ]
 | |
|         [
 | |
|             [ superclass 1array [ declare ] curry ]
 | |
|             [ "predicate-definition" word-prop ]
 | |
|             bi compose
 | |
|         ]
 | |
|         bi
 | |
|     ] { } map>assoc [ case ] curry
 | |
|     define ;
 | |
| 
 | |
| : predicate-quot ( class -- quot )
 | |
|     [
 | |
|         \ dup ,
 | |
|         dup superclass "predicate" word-prop %
 | |
|         "predicate-definition" word-prop , [ drop f ] , \ if ,
 | |
|     ] [ ] make ;
 | |
| 
 | |
| : define-predicate-class ( class superclass definition -- )
 | |
|     [ drop f f predicate-class define-class ]
 | |
|     [ nip "predicate-definition" set-word-prop ]
 | |
|     [
 | |
|         2drop
 | |
|         [ dup predicate-quot define-predicate ]
 | |
|         [ update-classes ]
 | |
|         bi
 | |
|     ]
 | |
|     3tri
 | |
|     update-predicate-instance ;
 | |
| 
 | |
| M: predicate-class reset-class
 | |
|     [ call-next-method ]
 | |
|     [ { "predicate-definition" } reset-props ]
 | |
|     bi ;
 | |
| 
 | |
| M: predicate-class rank-class drop 1 ;
 | |
| 
 | |
| M: predicate-class instance?
 | |
|     2dup superclass instance?
 | |
|     [ predicate-instance? ] [ 2drop f ] if ;
 | |
| 
 | |
| M: predicate-class (flatten-class)
 | |
|     superclass (flatten-class) ;
 | |
| 
 | |
| M: predicate-class (classes-intersect?)
 | |
|     superclass classes-intersect? ;
 |