 M: vocab-link (load-vocab)
     vocab-name (load-vocab) ;
 
-[ [ dup vocab [ ] [ ] ?if (load-vocab) ] with-compiler-errors ]
-load-vocab-hook set-global
+TUPLE: blacklisted-vocab name ;
+!
+: blacklisted-vocab ( name -- * )
+    \ blacklisted-vocab construct-boa throw ;
+
+M: blacklisted-vocab error.
+    "This vocabulary depends on the " write
+    blacklisted-vocab-name write
+    " vocabulary which failed to load" print ;
+
+[
+    dup vocab-name blacklist get member? [
+        vocab-name blacklisted-vocab
+    ] [
+        [
+            dup vocab [ ] [ ] ?if (load-vocab)
+        ] with-compiler-errors
+    ] if
+] load-vocab-hook set-global
 
 : vocab-where ( vocab -- loc )
     vocab-source-path dup [ 1 2array ] when ;

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

GENERIC: (load-vocab) ( name -- vocab )

M: vocab (load-vocab)
    dup vocab-root [
        dup vocab-source-loaded? [ dup load-source ] unless

: load-failures. ( failures -- )
    [ load-error. nl ] each ;

SYMBOL: blacklist

: require-all ( vocabs -- failures )
    [
        V{ } clone blacklist set
        [
            [
                [ require ]
                [
                    over vocab-name blacklist get push
                    error-continuation get 3array ,
                ] recover
            ] each
        ] { } make
    ] with-compiler-errors ;
