| 
									
										
										
										
											2017-08-25 18:34:26 -04:00
										 |  |  | ! Copyright (C) 2010 Joe Groff. | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2010-03-29 00:25:49 -04:00
										 |  |  | USING: accessors arrays combinators definitions fry kernel | 
					
						
							|  |  |  | locals.types namespaces parser quotations see sequences slots | 
					
						
							|  |  |  | words ;
 | 
					
						
							|  |  |  | FROM: kernel.private => declare ;
 | 
					
						
							| 
									
										
										
										
											2010-03-28 22:27:34 -04:00
										 |  |  | FROM: help.markup.private => link-effect? ;
 | 
					
						
							|  |  |  | IN: variables | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PREDICATE: variable < word | 
					
						
							| 
									
										
										
										
											2012-07-29 13:52:46 -04:00
										 |  |  |     "variable-setter" word-prop >boolean ;
 | 
					
						
							| 
									
										
										
										
											2010-03-28 22:27:34 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | GENERIC: variable-setter ( word -- word' )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: variable variable-setter "variable-setter" word-prop ;
 | 
					
						
							|  |  |  | M: local-reader variable-setter "local-writer" word-prop ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SYNTAX: set: | 
					
						
							|  |  |  |     scan-object variable-setter suffix! ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : [variable-getter] ( variable -- quot )
 | 
					
						
							|  |  |  |     '[ _ get ] ;
 | 
					
						
							|  |  |  | : [variable-setter] ( variable -- quot )
 | 
					
						
							|  |  |  |     '[ _ set ] ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : (define-variable) ( word getter setter -- )
 | 
					
						
							| 
									
										
										
										
											2011-10-18 16:18:42 -04:00
										 |  |  |     [ ( -- value ) define-inline ] | 
					
						
							| 
									
										
										
										
											2010-03-28 22:27:34 -04:00
										 |  |  |     [ | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |             [ name>> "set: " prepend <uninterned-word> ] | 
					
						
							|  |  |  |             [ over "variable-setter" set-word-prop ] bi
 | 
					
						
							| 
									
										
										
										
											2011-10-18 16:18:42 -04:00
										 |  |  |         ] dip ( value -- ) define-inline | 
					
						
							| 
									
										
										
										
											2010-03-28 22:27:34 -04:00
										 |  |  |     ] bi-curry* bi ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : define-variable ( word -- )
 | 
					
						
							|  |  |  |     dup [ [variable-getter] ] [ [variable-setter] ] bi (define-variable) ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SYNTAX: VAR: | 
					
						
							| 
									
										
										
										
											2012-07-29 13:52:46 -04:00
										 |  |  |     scan-new-word define-variable ;
 | 
					
						
							| 
									
										
										
										
											2010-03-28 22:27:34 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: variable definer drop \ VAR: f ;
 | 
					
						
							|  |  |  | M: variable definition drop f ;
 | 
					
						
							|  |  |  | M: variable link-effect? drop f ;
 | 
					
						
							|  |  |  | M: variable print-stack-effect? drop f ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-29 00:25:49 -04:00
										 |  |  | PREDICATE: typed-variable < variable | 
					
						
							| 
									
										
										
										
											2012-07-29 13:52:46 -04:00
										 |  |  |     "variable-type" word-prop >boolean ;
 | 
					
						
							| 
									
										
										
										
											2010-03-29 00:25:49 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : [typed-getter] ( quot type -- quot )
 | 
					
						
							|  |  |  |     1array '[ @ _ declare ] ;
 | 
					
						
							|  |  |  | : [typed-setter] ( quot type -- quot )
 | 
					
						
							|  |  |  |     instance-check-quot prepose ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : define-typed-variable ( word type -- )
 | 
					
						
							|  |  |  |     dupd { | 
					
						
							|  |  |  |         [ [ [variable-getter] ] dip [typed-getter] ] | 
					
						
							|  |  |  |         [ [ [variable-setter] ] dip [typed-setter] ] | 
					
						
							|  |  |  |         [ "variable-type" set-word-prop ] | 
					
						
							| 
									
										
										
										
											2011-11-14 13:25:28 -05:00
										 |  |  |         [ initial-value drop swap set-global ] | 
					
						
							| 
									
										
										
										
											2010-03-29 00:25:49 -04:00
										 |  |  |     } 2cleave (define-variable) ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SYNTAX: TYPED-VAR: | 
					
						
							| 
									
										
										
										
											2015-06-29 19:43:15 -04:00
										 |  |  |     scan-new-word scan-object define-typed-variable ;
 | 
					
						
							| 
									
										
										
										
											2010-03-29 00:25:49 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: typed-variable definer drop \ TYPED-VAR: f ;
 | 
					
						
							|  |  |  | M: typed-variable definition "variable-type" word-prop 1quotation ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-28 22:27:34 -04:00
										 |  |  | TUPLE: global-box value ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PREDICATE: global-variable < variable | 
					
						
							| 
									
										
										
										
											2010-03-29 00:25:49 -04:00
										 |  |  |     def>> first global-box? ;
 | 
					
						
							| 
									
										
										
										
											2010-03-28 22:27:34 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : [global-getter] ( box -- quot )
 | 
					
						
							|  |  |  |     '[ _ value>> ] ;
 | 
					
						
							|  |  |  | : [global-setter] ( box -- quot )
 | 
					
						
							| 
									
										
										
										
											2010-05-05 16:52:54 -04:00
										 |  |  |     '[ _ value<< ] ;
 | 
					
						
							| 
									
										
										
										
											2010-03-28 22:27:34 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : define-global ( word -- )
 | 
					
						
							|  |  |  |     global-box new [ [global-getter] ] [ [global-setter] ] bi (define-variable) ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SYNTAX: GLOBAL: | 
					
						
							| 
									
										
										
										
											2011-09-27 16:20:07 -04:00
										 |  |  |     scan-new-word define-global ;
 | 
					
						
							| 
									
										
										
										
											2010-03-28 22:27:34 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: global-variable definer drop \ GLOBAL: f ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-29 00:25:49 -04:00
										 |  |  | INTERSECTION: typed-global-variable | 
					
						
							|  |  |  |     global-variable typed-variable ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : define-typed-global ( word type -- )
 | 
					
						
							|  |  |  |     2dup "variable-type" set-word-prop | 
					
						
							| 
									
										
										
										
											2011-11-14 13:25:28 -05:00
										 |  |  |     dup initial-value drop global-box boa swap
 | 
					
						
							| 
									
										
										
										
											2010-03-29 00:25:49 -04:00
										 |  |  |     [ [ [global-getter] ] dip [typed-getter] ] | 
					
						
							|  |  |  |     [ [ [global-setter] ] dip [typed-setter] ] 2bi (define-variable) ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SYNTAX: TYPED-GLOBAL: | 
					
						
							| 
									
										
										
										
											2011-09-27 16:20:07 -04:00
										 |  |  |     scan-new-word scan-object define-typed-global ;
 | 
					
						
							| 
									
										
										
										
											2010-03-29 00:25:49 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: typed-global-variable definer drop \ TYPED-GLOBAL: f ;
 |