| 
									
										
										
										
											2008-02-01 18:48:29 -05:00
										 |  |  | ! Copyright (C) 2005, 2008 Slava Pestov. | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2008-04-07 21:44:43 -04:00
										 |  |  | USING: arrays definitions generic assocs kernel math namespaces | 
					
						
							| 
									
										
										
										
											2008-07-02 01:20:01 -04:00
										 |  |  | prettyprint sequences strings vectors words quotations summary | 
					
						
							| 
									
										
										
										
											2008-04-07 21:44:43 -04:00
										 |  |  | io.styles io combinators sorting splitting math.parser effects | 
					
						
							|  |  |  | continuations debugger io.files io.streams.string vocabs | 
					
						
							| 
									
										
										
										
											2008-06-25 04:25:08 -04:00
										 |  |  | io.encodings.utf8 source-files classes hashtables | 
					
						
							|  |  |  | compiler.errors compiler.units accessors sets lexer ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | IN: parser | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : location ( -- loc )
 | 
					
						
							| 
									
										
										
										
											2008-06-25 04:25:08 -04:00
										 |  |  |     file get lexer get line>> 2dup and
 | 
					
						
							|  |  |  |     [ >r path>> r> 2array ] [ 2drop f ] if ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : save-location ( definition -- )
 | 
					
						
							| 
									
										
										
										
											2007-12-24 17:18:26 -05:00
										 |  |  |     location remember-definition ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | SYMBOL: parser-notes | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | t parser-notes set-global
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : parser-notes? ( -- ? )
 | 
					
						
							|  |  |  |     parser-notes get "quiet" get not and ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : note. ( str -- )
 | 
					
						
							|  |  |  |     parser-notes? [ | 
					
						
							| 
									
										
										
										
											2008-06-25 05:06:18 -04:00
										 |  |  |         file get [ file. ] when*
 | 
					
						
							|  |  |  |         lexer get line>> number>string write ": " write
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  |         "Note: " write dup print
 | 
					
						
							|  |  |  |     ] when drop ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SYMBOL: use | 
					
						
							|  |  |  | SYMBOL: in | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : (use+) ( vocab -- )
 | 
					
						
							| 
									
										
										
										
											2008-04-07 01:16:05 -04:00
										 |  |  |     vocab-words use get push ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : use+ ( vocab -- )
 | 
					
						
							|  |  |  |     load-vocab (use+) ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : add-use ( seq -- ) [ use+ ] each ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : set-use ( seq -- )
 | 
					
						
							| 
									
										
										
										
											2008-05-14 00:36:55 -04:00
										 |  |  |     [ vocab-words ] V{ } map-as sift use set ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : check-vocab-string ( name -- name )
 | 
					
						
							|  |  |  |     dup string?
 | 
					
						
							|  |  |  |     [ "Vocabulary name must be a string" throw ] unless ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : set-in ( name -- )
 | 
					
						
							|  |  |  |     check-vocab-string dup in set create-vocab (use+) ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-08 16:32:55 -04:00
										 |  |  | M: parsing-word stack-effect drop (( parsed -- parsed )) ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:23:49 -04:00
										 |  |  | ERROR: no-current-vocab ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: no-current-vocab summary ( obj -- )
 | 
					
						
							| 
									
										
										
										
											2008-05-28 20:43:01 -04:00
										 |  |  |     drop "Not in a vocabulary; IN: form required" ;
 | 
					
						
							| 
									
										
										
										
											2008-04-25 01:23:49 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : current-vocab ( -- str )
 | 
					
						
							|  |  |  |     in get [ no-current-vocab ] unless* ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : create-in ( str -- word )
 | 
					
						
							|  |  |  |     current-vocab create dup set-word dup save-location ;
 | 
					
						
							| 
									
										
										
										
											2008-03-16 03:43:00 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | : CREATE ( -- word ) scan create-in ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-16 03:43:00 -04:00
										 |  |  | : CREATE-WORD ( -- word ) CREATE dup reset-generic ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | : word-restarts ( possibilities -- restarts )
 | 
					
						
							|  |  |  |     natural-sort [ | 
					
						
							|  |  |  |         [ "Use the word " swap summary append ] keep
 | 
					
						
							|  |  |  |     ] { } map>assoc ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-29 16:50:50 -04:00
										 |  |  | TUPLE: no-word-error name ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-29 06:03:17 -04:00
										 |  |  | M: no-word-error summary | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  |     drop "Word not found in current vocabulary search path" ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : no-word ( name -- newword )
 | 
					
						
							| 
									
										
										
										
											2008-04-13 16:06:09 -04:00
										 |  |  |     dup no-word-error boa
 | 
					
						
							| 
									
										
										
										
											2008-04-26 00:12:44 -04:00
										 |  |  |     swap words-named [ forward-reference? not ] filter
 | 
					
						
							| 
									
										
										
										
											2008-02-05 00:30:59 -05:00
										 |  |  |     word-restarts throw-restarts
 | 
					
						
							| 
									
										
										
										
											2008-06-28 03:36:20 -04:00
										 |  |  |     dup vocabulary>> (use+) ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-05 23:36:10 -05:00
										 |  |  | : check-forward ( str word -- word/f )
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  |     dup forward-reference? [ | 
					
						
							|  |  |  |         drop
 | 
					
						
							| 
									
										
										
										
											2008-02-05 23:36:10 -05:00
										 |  |  |         use get
 | 
					
						
							| 
									
										
										
										
											2008-05-14 00:36:55 -04:00
										 |  |  |         [ at ] with map sift
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  |         [ forward-reference? not ] find nip
 | 
					
						
							|  |  |  |     ] [ | 
					
						
							|  |  |  |         nip
 | 
					
						
							|  |  |  |     ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-05 23:36:10 -05:00
										 |  |  | : search ( str -- word/f )
 | 
					
						
							|  |  |  |     dup use get assoc-stack check-forward ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : scan-word ( -- word/number/f )
 | 
					
						
							| 
									
										
										
										
											2008-02-05 23:36:10 -05:00
										 |  |  |     scan dup [ | 
					
						
							|  |  |  |         dup search [ ] [ | 
					
						
							|  |  |  |             dup string>number [ ] [ no-word ] ?if
 | 
					
						
							|  |  |  |         ] ?if
 | 
					
						
							|  |  |  |     ] when ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-03-20 16:00:49 -04:00
										 |  |  | ERROR: staging-violation word ;
 | 
					
						
							| 
									
										
										
										
											2007-12-21 21:18:24 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: staging-violation summary | 
					
						
							|  |  |  |     drop
 | 
					
						
							|  |  |  |     "A parsing word cannot be used in the same file it is defined in." ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : execute-parsing ( word -- )
 | 
					
						
							| 
									
										
										
										
											2008-06-09 03:14:14 -04:00
										 |  |  |     dup changed-definitions get key? [ staging-violation ] when
 | 
					
						
							|  |  |  |     execute ;
 | 
					
						
							| 
									
										
										
										
											2007-12-21 21:18:24 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-25 04:25:08 -04:00
										 |  |  | : scan-object ( -- object )
 | 
					
						
							|  |  |  |     scan-word dup parsing-word? | 
					
						
							|  |  |  |     [ V{ } clone swap execute-parsing first ] when ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | : parse-step ( accum end -- accum ? )
 | 
					
						
							|  |  |  |     scan-word { | 
					
						
							|  |  |  |         { [ 2dup eq? ] [ 2drop f ] } | 
					
						
							|  |  |  |         { [ dup not ] [ drop unexpected-eof t ] } | 
					
						
							|  |  |  |         { [ dup delimiter? ] [ unexpected t ] } | 
					
						
							| 
									
										
										
										
											2008-06-08 16:32:55 -04:00
										 |  |  |         { [ dup parsing-word? ] [ nip execute-parsing t ] } | 
					
						
							| 
									
										
										
										
											2008-04-11 13:53:22 -04:00
										 |  |  |         [ pick push drop t ] | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  |     } cond ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : (parse-until) ( accum end -- accum )
 | 
					
						
							|  |  |  |     dup >r parse-step [ r> (parse-until) ] [ r> drop ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : parse-until ( end -- vec )
 | 
					
						
							|  |  |  |     100 <vector> swap (parse-until) ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : parsed ( accum obj -- accum ) over push ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : (parse-lines) ( lexer -- quot )
 | 
					
						
							| 
									
										
										
										
											2008-06-25 04:25:08 -04:00
										 |  |  |     [ f parse-until >quotation ] with-lexer ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : parse-lines ( lines -- quot )
 | 
					
						
							|  |  |  |     lexer-factory get call (parse-lines) ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : parse-literal ( accum end quot -- accum )
 | 
					
						
							|  |  |  |     >r parse-until r> call parsed ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : parse-definition ( -- quot )
 | 
					
						
							|  |  |  |     \ ; parse-until >quotation ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-08 16:32:55 -04:00
										 |  |  | : (:) ( -- word def ) CREATE-WORD parse-definition ;
 | 
					
						
							| 
									
										
										
										
											2008-03-16 03:43:00 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-25 04:25:08 -04:00
										 |  |  | ERROR: bad-number ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: bad-number summary | 
					
						
							|  |  |  |     drop "Bad number literal" ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-25 04:25:08 -04:00
										 |  |  | : parse-base ( parsed base -- parsed )
 | 
					
						
							|  |  |  |     scan swap base> [ bad-number ] unless* parsed ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | SYMBOL: bootstrap-syntax | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-28 21:45:16 -05:00
										 |  |  | : with-file-vocabs ( quot -- )
 | 
					
						
							|  |  |  |     [ | 
					
						
							| 
									
										
										
										
											2008-04-25 01:23:49 -04:00
										 |  |  |         f in set { "syntax" } set-use | 
					
						
							| 
									
										
										
										
											2007-12-28 21:45:16 -05:00
										 |  |  |         bootstrap-syntax get [ use get push ] when*
 | 
					
						
							|  |  |  |         call
 | 
					
						
							|  |  |  |     ] with-scope ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-01 19:26:32 -05:00
										 |  |  | SYMBOL: interactive-vocabs | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2008-04-04 01:33:06 -04:00
										 |  |  |     "accessors" | 
					
						
							| 
									
										
										
										
											2008-02-01 19:26:32 -05:00
										 |  |  |     "arrays" | 
					
						
							|  |  |  |     "assocs" | 
					
						
							|  |  |  |     "combinators" | 
					
						
							|  |  |  |     "compiler.errors" | 
					
						
							|  |  |  |     "continuations" | 
					
						
							|  |  |  |     "debugger" | 
					
						
							|  |  |  |     "definitions" | 
					
						
							|  |  |  |     "editors" | 
					
						
							|  |  |  |     "generic" | 
					
						
							|  |  |  |     "help" | 
					
						
							|  |  |  |     "inspector" | 
					
						
							|  |  |  |     "io" | 
					
						
							|  |  |  |     "io.files" | 
					
						
							|  |  |  |     "kernel" | 
					
						
							|  |  |  |     "listener" | 
					
						
							|  |  |  |     "math" | 
					
						
							|  |  |  |     "memory" | 
					
						
							|  |  |  |     "namespaces" | 
					
						
							|  |  |  |     "prettyprint" | 
					
						
							|  |  |  |     "sequences" | 
					
						
							|  |  |  |     "slicing" | 
					
						
							|  |  |  |     "sorting" | 
					
						
							|  |  |  |     "strings" | 
					
						
							|  |  |  |     "syntax" | 
					
						
							|  |  |  |     "tools.annotations" | 
					
						
							|  |  |  |     "tools.crossref" | 
					
						
							|  |  |  |     "tools.memory" | 
					
						
							|  |  |  |     "tools.profiler" | 
					
						
							|  |  |  |     "tools.test" | 
					
						
							| 
									
										
										
										
											2008-02-19 15:38:02 -05:00
										 |  |  |     "tools.threads" | 
					
						
							| 
									
										
										
										
											2008-02-01 19:26:32 -05:00
										 |  |  |     "tools.time" | 
					
						
							| 
									
										
										
										
											2008-03-13 04:45:08 -04:00
										 |  |  |     "tools.vocabs" | 
					
						
							| 
									
										
										
										
											2008-02-01 19:26:32 -05:00
										 |  |  |     "vocabs" | 
					
						
							|  |  |  |     "vocabs.loader" | 
					
						
							|  |  |  |     "words" | 
					
						
							|  |  |  |     "scratchpad" | 
					
						
							|  |  |  | } interactive-vocabs set-global
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-28 21:45:16 -05:00
										 |  |  | : with-interactive-vocabs ( quot -- )
 | 
					
						
							|  |  |  |     [ | 
					
						
							|  |  |  |         "scratchpad" in set
 | 
					
						
							| 
									
										
										
										
											2008-02-02 01:29:47 -05:00
										 |  |  |         interactive-vocabs get set-use | 
					
						
							| 
									
										
										
										
											2007-12-28 21:45:16 -05:00
										 |  |  |         call
 | 
					
						
							|  |  |  |     ] with-scope ; inline
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : parse-fresh ( lines -- quot )
 | 
					
						
							| 
									
										
										
										
											2007-12-28 21:45:16 -05:00
										 |  |  |     [ parse-lines ] with-file-vocabs ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : parsing-file ( file -- )
 | 
					
						
							|  |  |  |     "quiet" get [ | 
					
						
							|  |  |  |         drop
 | 
					
						
							|  |  |  |     ] [ | 
					
						
							|  |  |  |         "Loading " write <pathname> . flush
 | 
					
						
							|  |  |  |     ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-03 05:58:37 -04:00
										 |  |  | : filter-moved ( assoc1 assoc2 -- seq )
 | 
					
						
							| 
									
										
										
										
											2008-04-26 03:01:06 -04:00
										 |  |  |     swap assoc-diff [ | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  |         drop where dup [ first ] when
 | 
					
						
							|  |  |  |         file get source-file-path =
 | 
					
						
							| 
									
										
										
										
											2008-04-26 00:12:44 -04:00
										 |  |  |     ] assoc-filter keys ;
 | 
					
						
							| 
									
										
										
										
											2008-04-03 05:58:37 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : removed-definitions ( -- assoc1 assoc2 )
 | 
					
						
							|  |  |  |     new-definitions old-definitions | 
					
						
							| 
									
										
										
										
											2008-04-13 23:58:07 -04:00
										 |  |  |     [ get first2 assoc-union ] bi@ ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-03 05:58:37 -04:00
										 |  |  | : removed-classes ( -- assoc1 assoc2 )
 | 
					
						
							| 
									
										
										
										
											2007-12-30 17:14:15 -05:00
										 |  |  |     new-definitions old-definitions | 
					
						
							| 
									
										
										
										
											2008-04-03 05:58:37 -04:00
										 |  |  |     [ get second ] bi@ ;
 | 
					
						
							| 
									
										
										
										
											2007-12-24 17:18:26 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-03 22:43:41 -04:00
										 |  |  | : forget-removed-definitions ( -- )
 | 
					
						
							|  |  |  |     removed-definitions filter-moved forget-all ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : reset-removed-classes ( -- )
 | 
					
						
							|  |  |  |     removed-classes | 
					
						
							| 
									
										
										
										
											2008-06-11 18:40:33 -04:00
										 |  |  |     filter-moved [ class? ] filter [ forget-class ] each ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-24 01:26:54 -05:00
										 |  |  | : fix-class-words ( -- )
 | 
					
						
							|  |  |  |     #! If a class word had a compound definition which was | 
					
						
							|  |  |  |     #! removed, it must go back to being a symbol. | 
					
						
							| 
									
										
										
										
											2008-04-03 01:21:53 -04:00
										 |  |  |     new-definitions get first2
 | 
					
						
							| 
									
										
										
										
											2008-04-03 22:43:41 -04:00
										 |  |  |     filter-moved [ [ reset-generic ] [ define-symbol ] bi ] each ;
 | 
					
						
							| 
									
										
										
										
											2008-02-24 01:26:54 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | : forget-smudged ( -- )
 | 
					
						
							| 
									
										
										
										
											2008-04-03 22:43:41 -04:00
										 |  |  |     forget-removed-definitions | 
					
						
							|  |  |  |     reset-removed-classes | 
					
						
							| 
									
										
										
										
											2008-02-24 01:26:54 -05:00
										 |  |  |     fix-class-words ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-12 17:25:29 -05:00
										 |  |  | : finish-parsing ( lines quot -- )
 | 
					
						
							| 
									
										
										
										
											2007-12-21 21:18:24 -05:00
										 |  |  |     file get
 | 
					
						
							| 
									
										
										
										
											2008-04-03 01:21:53 -04:00
										 |  |  |     [ record-form ] | 
					
						
							|  |  |  |     [ record-definitions ] | 
					
						
							|  |  |  |     [ record-checksum ] | 
					
						
							|  |  |  |     tri ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : parse-stream ( stream name -- quot )
 | 
					
						
							|  |  |  |     [ | 
					
						
							|  |  |  |         [ | 
					
						
							| 
									
										
										
										
											2008-01-12 17:25:29 -05:00
										 |  |  |             lines dup parse-fresh | 
					
						
							| 
									
										
										
										
											2007-12-21 21:18:24 -05:00
										 |  |  |             tuck finish-parsing | 
					
						
							|  |  |  |             forget-smudged | 
					
						
							|  |  |  |         ] with-source-file | 
					
						
							|  |  |  |     ] with-compilation-unit ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : parse-file-restarts ( file -- restarts )
 | 
					
						
							|  |  |  |     "Load " swap " again" 3append t 2array 1array ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : parse-file ( file -- quot )
 | 
					
						
							|  |  |  |     [ | 
					
						
							| 
									
										
										
										
											2007-12-28 22:51:36 -05:00
										 |  |  |         [ | 
					
						
							|  |  |  |             [ parsing-file ] keep
 | 
					
						
							| 
									
										
										
										
											2008-03-27 00:47:51 -04:00
										 |  |  |             [ utf8 <file-reader> ] keep
 | 
					
						
							| 
									
										
										
										
											2007-12-28 22:51:36 -05:00
										 |  |  |             parse-stream | 
					
						
							|  |  |  |         ] with-compiler-errors | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  |     ] [ | 
					
						
							|  |  |  |         over parse-file-restarts rethrow-restarts
 | 
					
						
							|  |  |  |         drop parse-file | 
					
						
							|  |  |  |     ] recover ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : run-file ( file -- )
 | 
					
						
							| 
									
										
										
										
											2008-02-26 22:03:14 -05:00
										 |  |  |     [ dup parse-file call ] assert-depth drop ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : ?run-file ( path -- )
 | 
					
						
							| 
									
										
										
										
											2008-03-27 00:47:51 -04:00
										 |  |  |     dup exists? [ run-file ] [ drop ] if ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-21 21:18:24 -05:00
										 |  |  | : eval ( str -- )
 | 
					
						
							|  |  |  |     [ string-lines parse-fresh ] with-compilation-unit call ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : eval>string ( str -- output )
 | 
					
						
							|  |  |  |     [ | 
					
						
							|  |  |  |         parser-notes off
 | 
					
						
							|  |  |  |         [ [ eval ] keep ] try drop
 | 
					
						
							| 
									
										
										
										
											2008-02-15 23:20:31 -05:00
										 |  |  |     ] with-string-writer ;
 |