| 
									
										
										
										
											2009-03-22 21:16:31 -04:00
										 |  |  | ! Copyright (C) 2004, 2009 Slava Pestov. | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2008-06-28 03:36:20 -04:00
										 |  |  | USING: accessors arrays definitions assocs kernel kernel.private | 
					
						
							| 
									
										
										
										
											2008-12-17 19:10:01 -05:00
										 |  |  | slots.private namespaces make sequences strings words words.symbol | 
					
						
							|  |  |  | vectors math quotations combinators sorting effects graphs | 
					
						
							|  |  |  | vocabs sets ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | IN: classes | 
					
						
							| 
									
										
										
										
											2008-03-24 20:52:21 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-02 03:51:38 -04:00
										 |  |  | SYMBOL: class<=-cache | 
					
						
							| 
									
										
										
										
											2008-03-24 20:52:21 -04:00
										 |  |  | SYMBOL: class-not-cache | 
					
						
							|  |  |  | SYMBOL: classes-intersect-cache | 
					
						
							|  |  |  | SYMBOL: class-and-cache | 
					
						
							|  |  |  | SYMBOL: class-or-cache | 
					
						
							| 
									
										
										
										
											2008-10-01 09:20:49 -04:00
										 |  |  | SYMBOL: next-method-quot-cache | 
					
						
							| 
									
										
										
										
											2008-03-24 20:52:21 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : init-caches ( -- )
 | 
					
						
							| 
									
										
										
										
											2008-05-02 03:51:38 -04:00
										 |  |  |     H{ } clone class<=-cache set
 | 
					
						
							| 
									
										
										
										
											2008-03-24 20:52:21 -04:00
										 |  |  |     H{ } clone class-not-cache set
 | 
					
						
							|  |  |  |     H{ } clone classes-intersect-cache set
 | 
					
						
							|  |  |  |     H{ } clone class-and-cache set
 | 
					
						
							| 
									
										
										
										
											2008-10-01 09:20:49 -04:00
										 |  |  |     H{ } clone class-or-cache set
 | 
					
						
							|  |  |  |     H{ } clone next-method-quot-cache set ;
 | 
					
						
							| 
									
										
										
										
											2008-03-24 20:52:21 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : reset-caches ( -- )
 | 
					
						
							| 
									
										
										
										
											2008-05-02 03:51:38 -04:00
										 |  |  |     class<=-cache get clear-assoc
 | 
					
						
							| 
									
										
										
										
											2008-03-24 20:52:21 -04:00
										 |  |  |     class-not-cache get clear-assoc
 | 
					
						
							|  |  |  |     classes-intersect-cache get clear-assoc
 | 
					
						
							|  |  |  |     class-and-cache get clear-assoc
 | 
					
						
							| 
									
										
										
										
											2008-10-01 09:20:49 -04:00
										 |  |  |     class-or-cache get clear-assoc
 | 
					
						
							|  |  |  |     next-method-quot-cache get clear-assoc ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | SYMBOL: update-map | 
					
						
							| 
									
										
										
										
											2008-04-02 19:50:21 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-12 06:49:46 -04:00
										 |  |  | SYMBOL: implementors-map | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-05 19:32:02 -05:00
										 |  |  | PREDICATE: class < word "class" word-prop ;
 | 
					
						
							| 
									
										
										
										
											2008-04-02 19:50:21 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-12 06:49:46 -04:00
										 |  |  | : classes ( -- seq ) implementors-map get keys ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : predicate-word ( word -- predicate )
 | 
					
						
							| 
									
										
										
										
											2008-06-28 03:36:20 -04:00
										 |  |  |     [ name>> "?" append ] [ vocabulary>> ] bi create ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-26 19:23:19 -04:00
										 |  |  | PREDICATE: predicate < word "predicating" word-prop >boolean ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-13 01:40:18 -04:00
										 |  |  | M: predicate forget* | 
					
						
							|  |  |  |     [ call-next-method ] [ f "predicating" set-word-prop ] bi ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-05 19:32:02 -05:00
										 |  |  | M: predicate reset-word | 
					
						
							| 
									
										
										
										
											2009-03-13 01:40:18 -04:00
										 |  |  |     [ call-next-method ] [ f "predicating" set-word-prop ] bi ;
 | 
					
						
							| 
									
										
										
										
											2008-11-05 19:32:02 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-17 18:08:16 -05:00
										 |  |  | : define-predicate ( class quot -- )
 | 
					
						
							| 
									
										
										
										
											2008-11-05 19:32:02 -05:00
										 |  |  |     [ "predicate" word-prop first ] dip
 | 
					
						
							|  |  |  |     (( object -- ? )) define-declared ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : superclass ( class -- super )
 | 
					
						
							| 
									
										
										
										
											2008-03-24 20:52:21 -04:00
										 |  |  |     #! Output f for non-classes to work with algebra code | 
					
						
							|  |  |  |     dup class? [ "superclass" word-prop ] [ drop f ] if ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-27 02:42:13 -04:00
										 |  |  | : superclasses ( class -- supers )
 | 
					
						
							| 
									
										
										
										
											2008-04-02 22:27:49 -04:00
										 |  |  |     [ superclass ] follow reverse ;
 | 
					
						
							| 
									
										
										
										
											2008-03-27 02:42:13 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-24 20:52:21 -04:00
										 |  |  | : members ( class -- seq )
 | 
					
						
							|  |  |  |     #! Output f for non-classes to work with algebra code | 
					
						
							|  |  |  |     dup class? [ "members" word-prop ] [ drop f ] if ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-10 19:09:05 -04:00
										 |  |  | : participants ( class -- seq )
 | 
					
						
							|  |  |  |     #! Output f for non-classes to work with algebra code | 
					
						
							|  |  |  |     dup class? [ "participants" word-prop ] [ drop f ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-02 03:51:38 -04:00
										 |  |  | GENERIC: rank-class ( class -- n )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | GENERIC: reset-class ( class -- )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-25 04:25:08 -04:00
										 |  |  | M: class reset-class | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         "class" | 
					
						
							|  |  |  |         "metaclass" | 
					
						
							|  |  |  |         "superclass" | 
					
						
							|  |  |  |         "members" | 
					
						
							|  |  |  |         "participants" | 
					
						
							| 
									
										
										
										
											2008-07-04 02:32:11 -04:00
										 |  |  |         "predicate" | 
					
						
							| 
									
										
										
										
											2008-06-25 04:25:08 -04:00
										 |  |  |     } reset-props ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | M: word reset-class drop ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-12 06:49:46 -04:00
										 |  |  | GENERIC: implementors ( class/classes -- seq )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | ! update-map | 
					
						
							|  |  |  | : class-uses ( class -- seq )
 | 
					
						
							| 
									
										
										
										
											2008-05-10 19:09:05 -04:00
										 |  |  |     [ | 
					
						
							|  |  |  |         [ members % ] | 
					
						
							|  |  |  |         [ participants % ] | 
					
						
							|  |  |  |         [ superclass [ , ] when* ] | 
					
						
							|  |  |  |         tri
 | 
					
						
							|  |  |  |     ] { } make ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-04 02:32:11 -04:00
										 |  |  | : class-usage ( class -- seq ) update-map get at ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : class-usages ( class -- seq ) [ class-usage ] closure keys ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-09 03:14:14 -04:00
										 |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | : update-map+ ( class -- )
 | 
					
						
							|  |  |  |     dup class-uses update-map get add-vertex ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : update-map- ( class -- )
 | 
					
						
							|  |  |  |     dup class-uses update-map get remove-vertex ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-12 06:49:46 -04:00
										 |  |  | M: class implementors implementors-map get at keys ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: sequence implementors [ implementors ] gather ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : implementors-map+ ( class -- )
 | 
					
						
							|  |  |  |     H{ } clone swap implementors-map get set-at ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : implementors-map- ( class -- )
 | 
					
						
							|  |  |  |     implementors-map get delete-at ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-10 19:09:05 -04:00
										 |  |  | : make-class-props ( superclass members participants metaclass -- assoc )
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  |     [ | 
					
						
							| 
									
										
										
										
											2008-05-10 19:09:05 -04:00
										 |  |  |         { | 
					
						
							|  |  |  |             [ dup [ bootstrap-word ] when "superclass" set ] | 
					
						
							|  |  |  |             [ [ bootstrap-word ] map "members" set ] | 
					
						
							|  |  |  |             [ [ bootstrap-word ] map "participants" set ] | 
					
						
							|  |  |  |             [ "metaclass" set ] | 
					
						
							|  |  |  |         } spread
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  |     ] H{ } make-assoc ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-22 21:16:31 -04:00
										 |  |  | : ?define-symbol ( word -- )
 | 
					
						
							|  |  |  |     dup deferred? [ define-symbol ] [ drop ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | : (define-class) ( word props -- )
 | 
					
						
							| 
									
										
										
										
											2008-11-05 19:32:02 -05:00
										 |  |  |     [ | 
					
						
							| 
									
										
										
										
											2009-03-22 21:16:31 -04:00
										 |  |  |         { | 
					
						
							|  |  |  |             [ dup class? [ drop ] [ [ implementors-map+ ] [ new-class ] bi ] if ] | 
					
						
							|  |  |  |             [ reset-class ] | 
					
						
							|  |  |  |             [ ?define-symbol ] | 
					
						
							|  |  |  |             [ redefined ] | 
					
						
							|  |  |  |             [ ] | 
					
						
							|  |  |  |         } cleave
 | 
					
						
							|  |  |  |     ] dip [ assoc-union ] curry change-props | 
					
						
							| 
									
										
										
										
											2008-04-02 03:44:10 -04:00
										 |  |  |     dup predicate-word | 
					
						
							|  |  |  |     [ 1quotation "predicate" set-word-prop ] | 
					
						
							|  |  |  |     [ swap "predicating" set-word-prop ] | 
					
						
							|  |  |  |     [ drop t "class" set-word-prop ] | 
					
						
							|  |  |  |     2tri ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-28 23:59:48 -04:00
										 |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-29 03:46:29 -04:00
										 |  |  | GENERIC: update-class ( class -- )
 | 
					
						
							| 
									
										
										
										
											2008-01-31 01:49:18 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-29 03:46:29 -04:00
										 |  |  | M: class update-class drop ;
 | 
					
						
							| 
									
										
										
										
											2008-01-31 01:49:18 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-11 18:40:33 -04:00
										 |  |  | GENERIC: update-methods ( class seq -- )
 | 
					
						
							| 
									
										
										
										
											2008-01-09 04:52:08 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-02 03:44:10 -04:00
										 |  |  | : update-classes ( class -- )
 | 
					
						
							| 
									
										
										
										
											2008-06-09 03:14:14 -04:00
										 |  |  |     dup class-usages | 
					
						
							| 
									
										
										
										
											2008-06-11 18:40:33 -04:00
										 |  |  |     [ nip [ update-class ] each ] [ update-methods ] 2bi ;
 | 
					
						
							| 
									
										
										
										
											2008-04-02 03:44:10 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-10 19:09:05 -04:00
										 |  |  | : define-class ( word superclass members participants metaclass -- )
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  |     #! If it was already a class, update methods after. | 
					
						
							| 
									
										
										
										
											2008-03-24 20:52:21 -04:00
										 |  |  |     reset-caches | 
					
						
							| 
									
										
										
										
											2008-04-02 03:44:10 -04:00
										 |  |  |     make-class-props | 
					
						
							| 
									
										
										
										
											2008-03-29 03:46:29 -04:00
										 |  |  |     [ drop update-map- ] | 
					
						
							| 
									
										
										
										
											2008-04-02 03:44:10 -04:00
										 |  |  |     [ (define-class) ] | 
					
						
							|  |  |  |     [ drop update-map+ ] | 
					
						
							|  |  |  |     2tri ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-11 21:46:53 -04:00
										 |  |  | : forget-predicate ( class -- )
 | 
					
						
							|  |  |  |     dup "predicate" word-prop | 
					
						
							|  |  |  |     dup length 1 = [ | 
					
						
							|  |  |  |         first
 | 
					
						
							| 
									
										
										
										
											2009-01-23 19:20:47 -05:00
										 |  |  |         [ nip ] [ "predicating" word-prop = ] 2bi
 | 
					
						
							| 
									
										
										
										
											2008-06-11 21:46:53 -04:00
										 |  |  |         [ forget ] [ drop ] if
 | 
					
						
							|  |  |  |     ] [ 2drop ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-06 05:16:39 -04:00
										 |  |  | GENERIC: forget-methods ( class -- )
 | 
					
						
							| 
									
										
										
										
											2008-06-12 06:49:46 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-04 02:32:11 -04:00
										 |  |  | GENERIC: class-forgotten ( use class -- )
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-12 06:49:46 -04:00
										 |  |  | : forget-class ( class -- )
 | 
					
						
							| 
									
										
										
										
											2008-07-04 02:32:11 -04:00
										 |  |  |     { | 
					
						
							|  |  |  |         [ dup class-usage keys [ class-forgotten ] with each ] | 
					
						
							|  |  |  |         [ forget-predicate ] | 
					
						
							|  |  |  |         [ forget-methods ] | 
					
						
							|  |  |  |         [ implementors-map- ] | 
					
						
							|  |  |  |         [ update-map- ] | 
					
						
							|  |  |  |         [ reset-class ] | 
					
						
							| 
									
										
										
										
											2008-11-04 03:17:37 -05:00
										 |  |  |     } cleave
 | 
					
						
							|  |  |  |     reset-caches ;
 | 
					
						
							| 
									
										
										
										
											2008-07-04 02:32:11 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: class class-forgotten | 
					
						
							|  |  |  |     nip forget-class ;
 | 
					
						
							| 
									
										
										
										
											2008-06-12 06:49:46 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: class forget* ( class -- )
 | 
					
						
							| 
									
										
										
										
											2008-06-29 03:12:44 -04:00
										 |  |  |     [ call-next-method ] [ forget-class ] bi ;
 | 
					
						
							| 
									
										
										
										
											2008-06-12 06:49:46 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-02 01:28:07 -04:00
										 |  |  | GENERIC: class ( object -- class )
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-22 18:38:23 -04:00
										 |  |  | GENERIC: instance? ( object class -- ? ) flushable
 |