| 
									
										
										
										
											2009-03-22 19:00:26 -04:00
										 |  |  | ! Copyright (C) 2008, 2009 Slava Pestov. | 
					
						
							| 
									
										
										
										
											2008-06-25 04:25:08 -04:00
										 |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2011-11-30 19:02:37 -05:00
										 |  |  | USING: accessors arrays combinators effects.parser generic | 
					
						
							|  |  |  | kernel namespaces parser quotations sequences words ;
 | 
					
						
							| 
									
										
										
										
											2008-06-25 04:25:08 -04:00
										 |  |  | IN: generic.parser | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ERROR: not-in-a-method-error ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-27 16:20:07 -04:00
										 |  |  | : scan-new-generic ( -- word ) scan-new dup reset-word ;
 | 
					
						
							| 
									
										
										
										
											2008-06-25 04:25:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-22 19:00:26 -04:00
										 |  |  | : (GENERIC:) ( quot -- )
 | 
					
						
							| 
									
										
										
										
											2011-10-17 01:50:30 -04:00
										 |  |  |     [ scan-new-generic ] dip call scan-effect define-generic ; inline
 | 
					
						
							| 
									
										
										
										
											2009-03-22 19:00:26 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-25 04:25:08 -04:00
										 |  |  | : create-method-in ( class generic -- method )
 | 
					
						
							| 
									
										
										
										
											2013-03-23 19:05:14 -04:00
										 |  |  |     create-method dup set-last-word dup save-location ;
 | 
					
						
							| 
									
										
										
										
											2008-06-25 04:25:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-01 23:10:28 -05:00
										 |  |  | : define-inline-method ( class generic quot -- )
 | 
					
						
							|  |  |  |     [ create-method-in ] dip [ define ] [ drop make-inline ] 2bi ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-27 16:20:07 -04:00
										 |  |  | : scan-new-method ( -- method )
 | 
					
						
							| 
									
										
										
										
											2011-11-22 02:00:52 -05:00
										 |  |  |     scan-class bootstrap-word scan-word create-method-in ;
 | 
					
						
							| 
									
										
										
										
											2008-06-25 04:25:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-22 20:57:25 -05:00
										 |  |  | SYMBOL: current-method | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : with-method-definition ( method quot -- )
 | 
					
						
							| 
									
										
										
										
											2008-11-24 17:28:35 -05:00
										 |  |  |     over current-method set call current-method off ; inline
 | 
					
						
							| 
									
										
										
										
											2008-06-25 04:25:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-13 19:40:52 -04:00
										 |  |  | : generic-effect ( word -- effect )
 | 
					
						
							|  |  |  |     "method-generic" word-prop "declared-effect" word-prop ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : method-effect= ( method-effect generic-effect -- ? )
 | 
					
						
							| 
									
										
										
										
											2012-07-21 13:22:44 -04:00
										 |  |  |     [ [ in>> length ] same? ] | 
					
						
							| 
									
										
										
										
											2011-10-13 19:40:52 -04:00
										 |  |  |     [ | 
					
						
							|  |  |  |         over terminated?>> | 
					
						
							| 
									
										
										
										
											2012-07-21 13:22:44 -04:00
										 |  |  |         [ 2drop t ] [ [ out>> length ] same? ] if
 | 
					
						
							| 
									
										
										
										
											2011-10-13 19:40:52 -04:00
										 |  |  |     ] 2bi and ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ERROR: bad-method-effect ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : check-method-effect ( effect -- )
 | 
					
						
							| 
									
										
										
										
											2015-08-13 19:13:05 -04:00
										 |  |  |     last-word generic-effect method-effect= [ bad-method-effect ] unless ;
 | 
					
						
							| 
									
										
										
										
											2011-10-13 19:40:52 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : parse-method-definition ( -- quot )
 | 
					
						
							|  |  |  |     scan-datum { | 
					
						
							|  |  |  |         { \ ( [ ")" parse-effect check-method-effect parse-definition ] } | 
					
						
							|  |  |  |         { \ ; [ [ ] ] } | 
					
						
							|  |  |  |         [ ?execute-parsing \ ; parse-until append >quotation ] | 
					
						
							|  |  |  |     } case ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-16 07:17:18 -04:00
										 |  |  | : (M:) ( -- method def )
 | 
					
						
							| 
									
										
										
										
											2012-08-24 18:53:00 -04:00
										 |  |  |     [ | 
					
						
							|  |  |  |         scan-new-method [ parse-method-definition ] with-method-definition | 
					
						
							| 
									
										
										
										
											2012-08-24 19:07:31 -04:00
										 |  |  |     ] with-definition ;
 |