     [ load-error. nl ] each ;
 
 SYMBOL: blacklist
+SYMBOL: failures
 
 : require-all ( vocabs -- failures )
     [
         V{ } clone blacklist set
+        V{ } clone failures set
         [
             [ require ]
-            [ >r vocab-name r> 2array blacklist get push ]
+            [ swap vocab-name failures get set-at ]
             recover
         ] each
-        blacklist get
+        failures get
     ] with-compiler-errors ;
 
 : do-refresh ( modified-sources modified-docs -- )

: refresh-all ( -- ) "" refresh ;

GENERIC: (load-vocab) ( name -- vocab )
!
M: vocab (load-vocab)
    dup vocab-root [
        dup vocab-source-loaded? [ dup load-source ] unless
        dup vocab-docs-loaded? [ dup load-docs ] unless
    ] when ;

M: string (load-vocab)
    [ ".private" ?tail drop reload ] keep vocab ;

M: vocab-link (load-vocab)
    vocab-name (load-vocab) ;

[
    dup vocab-name blacklist get at* [
        rethrow
    ] [
        drop
        [ dup vocab swap or (load-vocab) ] with-compiler-errors
    ] if

] load-vocab-hook set-global

: vocab-where ( vocab -- loc )
