vocab-name "Already using ``" "'' vocabulary" surround note.
] [
manifest get
- [ [ load-vocab ] dip search-vocabs>> push ]
+ [ [ ?load-vocab ] dip search-vocabs>> push ]
[ [ vocab-name ] dip search-vocab-names>> adjoin ]
2bi
] if ;
: unuse-words ( assoc -- )
<extra-words> qualified-vocabs remove! drop ;
+: with-words ( assoc quot -- )
+ '[ use-words @ ] over '[ _ unuse-words ] finally ; inline
+
TUPLE: ambiguous-use-error name words ;
: <ambiguous-use-error> ( name words -- error restarts )
<PRIVATE
+: (lookup-word) ( words name vocab -- words )
+ words>> (lookup) [ suffix! ] when* ; inline
+
: (vocab-search) ( name assocs -- words )
- [ words>> (lookup) ] with map sift ;
+ [ V{ } clone ] 2dip [ (lookup-word) ] with each ;
-: (vocab-search-qualified) ( name assocs -- words )
- [ ":" split1 swap ] dip [ name>> = ] with filter (vocab-search) ;
+: (vocab-search-qualified) ( words name assocs -- words )
+ [ ":" split1 swap ] dip pick [
+ [ name>> = ] with find nip [ (lookup-word) ] with when*
+ ] [
+ 3drop
+ ] if ;
: (vocab-search-full) ( name assocs -- words )
- [ (vocab-search-qualified) ] [ (vocab-search) ] 2bi append ;
+ [ (vocab-search) ] [ (vocab-search-qualified) ] 2bi ;
: vocab-search ( name manifest -- word/f )
dupd search-vocabs>> (vocab-search-full) dup length {
[ call ] [
[ manifest get add-definition-observer call ]
[ manifest get remove-definition-observer ]
- [ ]
- cleanup
+ finally
] if-bootstrapping
] with-variable ; inline