From 043578ca1de11634502ba77cc9038535a000ca8c Mon Sep 17 00:00:00 2001 From: Daniel Ehrenberg Date: Thu, 18 Mar 2010 00:00:32 -0400 Subject: [PATCH] require-if loads vocabs conditionally, now or later --- core/vocabs/loader/loader-tests.factor | 18 ++++++++++++++++++ core/vocabs/loader/loader.factor | 16 +++++++++++++++- core/vocabs/loader/test/m/m.factor | 4 ++++ core/vocabs/loader/test/n/n.factor | 1 + core/vocabs/loader/test/o/o.factor | 1 + core/vocabs/vocabs.factor | 9 ++++++--- 6 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 core/vocabs/loader/test/m/m.factor create mode 100644 core/vocabs/loader/test/n/n.factor create mode 100644 core/vocabs/loader/test/o/o.factor diff --git a/core/vocabs/loader/loader-tests.factor b/core/vocabs/loader/loader-tests.factor index 09f28541e0..89afb50af7 100644 --- a/core/vocabs/loader/loader-tests.factor +++ b/core/vocabs/loader/loader-tests.factor @@ -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 diff --git a/core/vocabs/loader/loader.factor b/core/vocabs/loader/loader.factor index c8cf77b795..2acefe4cef 100644 --- a/core/vocabs/loader/loader.factor +++ b/core/vocabs/loader/loader.factor @@ -62,8 +62,15 @@ SYMBOL: check-vocab-hook check-vocab-hook [ [ drop ] ] initialize +DEFER: require + >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 index 0000000000..e5106d86b7 --- /dev/null +++ b/core/vocabs/loader/test/m/m.factor @@ -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 index 0000000000..b3cedb3006 --- /dev/null +++ b/core/vocabs/loader/test/n/n.factor @@ -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 index 0000000000..cc8051ab38 --- /dev/null +++ b/core/vocabs/loader/test/o/o.factor @@ -0,0 +1 @@ +IN: vocabs.loader.test.o diff --git a/core/vocabs/vocabs.factor b/core/vocabs/vocabs.factor index 239b88a2e8..e48d6c3031 100644 --- a/core/vocabs/vocabs.factor +++ b/core/vocabs/vocabs.factor @@ -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 [ ] cache @@ -118,8 +121,8 @@ M: vocab-spec >vocab-link ; M: string >vocab-link dup vocab [ ] [ ] ?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 ;