93 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			93 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Factor
		
	
	
|  | ! Copyright (C) 2004, 2007 Slava Pestov. | ||
|  | ! See http://factorcode.org/license.txt for BSD license. | ||
|  | USING: kernel namespaces arrays sequences io inference.backend | ||
|  | generator debugger math.parser prettyprint words continuations | ||
|  | vocabs assocs alien.compiler ;
 | ||
|  | IN: compiler | ||
|  | 
 | ||
|  | M: object inference-error-major? drop t ;
 | ||
|  | 
 | ||
|  | : compile-error ( word error -- )
 | ||
|  |     batch-mode get [ | ||
|  |         2array compile-errors get push
 | ||
|  |     ] [ | ||
|  |         "quiet" get [ drop ] [ print-error flush ] if drop
 | ||
|  |     ] if ;
 | ||
|  | 
 | ||
|  | : begin-batch ( seq -- )
 | ||
|  |     batch-mode on
 | ||
|  |     [ | ||
|  |         "Compiling " % length # " words..." % | ||
|  |     ] "" make print flush
 | ||
|  |     V{ } clone compile-errors set-global ;
 | ||
|  | 
 | ||
|  | : compile-error. ( pair -- )
 | ||
|  |     nl
 | ||
|  |     "While compiling " write dup first pprint ": " print
 | ||
|  |     nl
 | ||
|  |     second print-error ;
 | ||
|  | 
 | ||
|  | : (:errors) ( -- seq )
 | ||
|  |     compile-errors get-global
 | ||
|  |     [ second inference-error-major? ] subset ;
 | ||
|  | 
 | ||
|  | : :errors (:errors) [ compile-error. ] each ;
 | ||
|  | 
 | ||
|  | : (:warnings) ( -- seq )
 | ||
|  |     compile-errors get-global
 | ||
|  |     [ second inference-error-major? not ] subset ;
 | ||
|  | 
 | ||
|  | : :warnings (:warnings) [ compile-error. ] each ;
 | ||
|  | 
 | ||
|  | : end-batch ( -- )
 | ||
|  |     batch-mode off
 | ||
|  |     "quiet" get [ | ||
|  |         "Compile finished." print
 | ||
|  |         nl
 | ||
|  |         ":errors - print " write (:errors) length pprint | ||
|  |         " compiler errors." print
 | ||
|  |         ":warnings - print " write (:warnings) length pprint | ||
|  |         " compiler warnings." print
 | ||
|  |         nl
 | ||
|  |     ] unless ;
 | ||
|  | 
 | ||
|  | : compile ( word -- )
 | ||
|  |     H{ } clone [ | ||
|  |         compiled-xts [ (compile) ] with-variable
 | ||
|  |     ] keep >alist finalize-compile ;
 | ||
|  | 
 | ||
|  | : compile-failed ( word error -- )
 | ||
|  |     dupd compile-error dup update-xt unchanged-word ;
 | ||
|  | 
 | ||
|  | : try-compile ( word -- )
 | ||
|  |     [ compile ] [ compile-failed ] recover ;
 | ||
|  | 
 | ||
|  | : forget-errors ( seq -- )
 | ||
|  |     [ f "no-effect" set-word-prop ] each ;
 | ||
|  | 
 | ||
|  | : compile-batch ( seq -- )
 | ||
|  |     dup empty? [ | ||
|  |         drop
 | ||
|  |     ] [ | ||
|  |         dup begin-batch | ||
|  |         dup forget-errors | ||
|  |         [ try-compile ] each
 | ||
|  |         end-batch | ||
|  |     ] if ;
 | ||
|  | 
 | ||
|  | : compile-vocabs ( seq -- ) [ words ] map concat compile-batch ;
 | ||
|  | 
 | ||
|  | : compile-all ( -- ) vocabs compile-vocabs ;
 | ||
|  | 
 | ||
|  | : compile-quot ( quot -- word ) define-temp dup compile ;
 | ||
|  | 
 | ||
|  | : compile-1 ( quot -- ) compile-quot execute ;
 | ||
|  | 
 | ||
|  | : recompile ( -- )
 | ||
|  |     changed-words get [ | ||
|  |         dup keys compile-batch clear-assoc
 | ||
|  |     ] when* ;
 | ||
|  | 
 | ||
|  | : recompile-all ( -- )
 | ||
|  |     all-words [ changed-word ] each recompile ;
 |