]> gitweb.factorcode.org Git - factor.git/commitdiff
require-if loads vocabs conditionally, now or later
authorDaniel Ehrenberg <littledan@Macintosh-122.local>
Thu, 18 Mar 2010 04:00:32 +0000 (00:00 -0400)
committerDaniel Ehrenberg <littledan@Macintosh-122.local>
Thu, 18 Mar 2010 04:00:32 +0000 (00:00 -0400)
core/vocabs/loader/loader-tests.factor
core/vocabs/loader/loader.factor
core/vocabs/loader/test/m/m.factor [new file with mode: 0644]
core/vocabs/loader/test/n/n.factor [new file with mode: 0644]
core/vocabs/loader/test/o/o.factor [new file with mode: 0644]
core/vocabs/vocabs.factor

index 09f28541e0ba92c844a24b84e346d837b3b86f7d..89afb50af7b15bd83ef9e567e2783b3318752520 100644 (file)
@@ -170,3 +170,21 @@ forget-junk
 ] with-compilation-unit
 
 [ ] [ [ "vocabs.loader.test.j" require ] [ drop :1 ] recover ] unit-test
+
+[ ] [ "vocabs.loader.test.m" require ] unit-test
+[ f ] [ "vocabs.loader.test.n" vocab ] unit-test
+[ ] [ "vocabs.loader.test.o" require ] unit-test
+[ t ] [ "vocabs.loader.test.n" vocab >boolean ] unit-test
+
+[
+    "mno" [ "vocabs.loader.test." swap suffix forget-vocab ] each
+] with-compilation-unit
+
+[ ] [ "vocabs.loader.test.o" require ] unit-test
+[ f ] [ "vocabs.loader.test.n" vocab ] unit-test
+[ ] [ "vocabs.loader.test.m" require ] unit-test
+[ t ] [ "vocabs.loader.test.n" vocab >boolean ] unit-test
+
+[
+    "mno" [ "vocabs.loader.test." swap suffix forget-vocab ] each
+] with-compilation-unit
index c8cf77b795612145bc2a0acbe6fda1d21ff1d6d0..2acefe4cefb516c1376ec99d4a22cd77ac00943c 100644 (file)
@@ -62,8 +62,15 @@ SYMBOL: check-vocab-hook
 
 check-vocab-hook [ [ drop ] ] initialize
 
+DEFER: require
+
 <PRIVATE
 
+: load-conditional-requires ( vocab-name -- )
+    conditional-requires get
+    [ at [ require ] each ] 
+    [ delete-at ] 2bi ;
+
 : load-source ( vocab -- )
     dup check-vocab-hook get call( vocab -- )
     [
@@ -71,7 +78,8 @@ check-vocab-hook [ [ drop ] ] initialize
         dup vocab-source-path [ parse-file ] [ [ ] ] if*
         [ +parsing+ >>source-loaded? ] dip
         [ % ] [ call( -- ) ] if-bootstrapping
-        +done+ >>source-loaded? drop
+        +done+ >>source-loaded?
+        vocab-name load-conditional-requires
     ] [ ] [ f >>source-loaded? ] cleanup ;
 
 : load-docs ( vocab -- )
@@ -88,6 +96,12 @@ PRIVATE>
 : require ( vocab -- )
     load-vocab drop ;
 
+: require-if ( if then -- )
+    over vocab
+    [ nip require ]
+    [ swap conditional-requires get [ swap suffix ] change-at ]
+    if ;
+
 : reload ( name -- )
     dup vocab
     [ [ load-source ] [ load-docs ] bi ]
diff --git a/core/vocabs/loader/test/m/m.factor b/core/vocabs/loader/test/m/m.factor
new file mode 100644 (file)
index 0000000..e5106d8
--- /dev/null
@@ -0,0 +1,4 @@
+USE: vocabs.loader
+IN: vocabs.loader.test.m
+
+"vocabs.loader.test.o" "vocabs.loader.test.n" require-if
diff --git a/core/vocabs/loader/test/n/n.factor b/core/vocabs/loader/test/n/n.factor
new file mode 100644 (file)
index 0000000..b3cedb3
--- /dev/null
@@ -0,0 +1 @@
+IN: vocabs.loader.test.n
diff --git a/core/vocabs/loader/test/o/o.factor b/core/vocabs/loader/test/o/o.factor
new file mode 100644 (file)
index 0000000..cc8051a
--- /dev/null
@@ -0,0 +1 @@
+IN: vocabs.loader.test.o
index 239b88a2e80b6030285b0390602445a292072f7c..e48d6c3031317965d7c24f9dd80acd5d0c680604 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2007, 2009 Eduardo Cavazos, Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors assocs strings kernel sorting namespaces
-sequences definitions ;
+sequences definitions sets ;
 IN: vocabs
 
 SYMBOL: dictionary
@@ -83,6 +83,9 @@ ERROR: bad-vocab-name name ;
 : check-vocab-name ( name -- name )
     dup string? [ bad-vocab-name ] unless ;
 
+SYMBOL: conditional-requires
+conditional-requires [ H{ } clone ] initialize
+
 : create-vocab ( name -- vocab )
     check-vocab-name
     dictionary get [ <vocab> ] cache
@@ -118,8 +121,8 @@ M: vocab-spec >vocab-link ;
 M: string >vocab-link dup vocab [ ] [ <vocab-link> ] ?if ;
 
 : forget-vocab ( vocab -- )
-    dup words forget-all
-    vocab-name dictionary get delete-at
+    [ words forget-all ]
+    [ vocab-name dictionary get delete-at ] bi
     notify-vocab-observers ;
 
 M: vocab-spec forget* forget-vocab ;