]> gitweb.factorcode.org Git - factor.git/blobdiff - core/vocabs/parser/parser.factor
calendar: change >gmt, >local-time to clone.
[factor.git] / core / vocabs / parser / parser.factor
index 4249fe3c270ee8a959a298f213eaf41da9609ac4..cec44020512964b0acb6b65607fd96efa5227dd2 100644 (file)
@@ -115,7 +115,7 @@ ERROR: unbalanced-private-declaration vocab ;
         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 ;
@@ -175,6 +175,9 @@ TUPLE: rename word vocab words ;
 : 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 )
@@ -182,14 +185,21 @@ TUPLE: ambiguous-use-error name words ;
 
 <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 {
@@ -264,7 +274,6 @@ PRIVATE>
         [ call ] [
             [ manifest get add-definition-observer call ]
             [ manifest get remove-definition-observer ]
-            [ ]
-            cleanup
+            finally
         ] if-bootstrapping
     ] with-variable ; inline