diff --git a/basis/bootstrap/help/help.factor b/basis/bootstrap/help/help.factor index e2a2288988..5b49ce2802 100644 --- a/basis/bootstrap/help/help.factor +++ b/basis/bootstrap/help/help.factor @@ -1,6 +1,6 @@ USING: help help.topics help.syntax help.crossref help.definitions io io.files kernel namespaces vocabs sequences -parser vocabs.loader ; +parser vocabs.loader vocabs.loader.private accessors assocs ; IN: bootstrap.help : load-help ( -- ) @@ -10,8 +10,8 @@ IN: bootstrap.help t load-help? set-global [ drop ] load-vocab-hook [ - vocabs - [ vocab-docs-loaded? not ] filter + dictionary get values + [ docs-loaded?>> not ] filter [ load-docs ] each ] with-variable ; diff --git a/basis/tools/test/test.factor b/basis/tools/test/test.factor index 5c2bd8f4e3..73b261bf13 100644 --- a/basis/tools/test/test.factor +++ b/basis/tools/test/test.factor @@ -49,7 +49,7 @@ SYMBOL: this-test [ drop t ] must-fail-with ; : (run-test) ( vocab -- ) - dup vocab-source-loaded? [ + dup vocab source-loaded?>> [ vocab-tests [ run-file ] each ] [ drop ] if ; diff --git a/basis/tools/vocabs/vocabs.factor b/basis/tools/vocabs/vocabs.factor index b492ef4da2..d926b67078 100644 --- a/basis/tools/vocabs/vocabs.factor +++ b/basis/tools/vocabs/vocabs.factor @@ -134,12 +134,12 @@ SYMBOL: modified-docs [ [ [ modified-sources ] - [ vocab-source-loaded? ] + [ vocab source-loaded?>> ] [ vocab-source-path ] tri (to-refresh) ] [ [ modified-docs ] - [ vocab-docs-loaded? ] + [ vocab docs-loaded?>> ] [ vocab-docs-path ] tri (to-refresh) ] bi @@ -154,8 +154,8 @@ SYMBOL: modified-docs : do-refresh ( modified-sources modified-docs unchanged -- ) unchanged-vocabs [ - [ [ f swap set-vocab-source-loaded? ] each ] - [ [ f swap set-vocab-docs-loaded? ] each ] bi* + [ [ vocab f >>source-loaded? drop ] each ] + [ [ vocab f >>docs-loaded? drop ] each ] bi* ] [ append prune diff --git a/core/vocabs/loader/loader-docs.factor b/core/vocabs/loader/loader-docs.factor index 1325110122..89b8a0728d 100644 --- a/core/vocabs/loader/loader-docs.factor +++ b/core/vocabs/loader/loader-docs.factor @@ -1,4 +1,5 @@ -USING: vocabs help.markup help.syntax words strings io ; +USING: vocabs vocabs.loader.private help.markup help.syntax +words strings io ; IN: vocabs.loader ARTICLE: "vocabs.roots" "Vocabulary roots" diff --git a/core/vocabs/loader/loader-tests.factor b/core/vocabs/loader/loader-tests.factor index 3f06b9735c..7b53e98df1 100644 --- a/core/vocabs/loader/loader-tests.factor +++ b/core/vocabs/loader/loader-tests.factor @@ -51,7 +51,7 @@ IN: vocabs.loader.tests 2 [ [ "vocabs.loader.test.a" require ] must-fail - [ f ] [ "vocabs.loader.test.a" vocab-source-loaded? ] unit-test + [ f ] [ "vocabs.loader.test.a" vocab source-loaded?>> ] unit-test [ t ] [ "resource:core/vocabs/loader/test/a/a.factor" @@ -129,9 +129,9 @@ IN: vocabs.loader.tests ] with-compilation-unit ] unit-test -[ t ] [ +[ +done+ ] [ [ "vocabs.loader.test.d" require ] [ :1 ] recover - "vocabs.loader.test.d" vocab-source-loaded? + "vocabs.loader.test.d" vocab source-loaded?>> ] unit-test : forget-junk @@ -156,3 +156,21 @@ forget-junk [ "vocabs.loader.test.e" require ] [ relative-overflow? ] must-fail-with + +0 "vocabs.loader.test.g" set-global + +[ + "vocabs.loader.test.f" forget-vocab + "vocabs.loader.test.g" forget-vocab +] with-compilation-unit + +[ ] [ "vocabs.loader.test.g" require ] unit-test + +[ 1 ] [ "vocabs.loader.test.g" get-global ] unit-test + +[ + "vocabs.loader.test.h" forget-vocab + "vocabs.loader.test.i" forget-vocab +] with-compilation-unit + +[ ] [ "vocabs.loader.test.h" require ] unit-test diff --git a/core/vocabs/loader/loader.factor b/core/vocabs/loader/loader.factor index 690b8b0d92..f952900bbf 100644 --- a/core/vocabs/loader/loader.factor +++ b/core/vocabs/loader/loader.factor @@ -19,24 +19,27 @@ V{ vocab-name { { CHAR: . CHAR: / } } substitute ; : vocab-dir+ ( vocab str/f -- path ) - >r vocab-name "." split r> - [ >r dup peek r> append suffix ] when* + [ vocab-name "." split ] dip + [ [ dup peek ] dip append suffix ] when* "/" join ; : vocab-dir? ( root name -- ? ) - over [ - ".factor" vocab-dir+ append-path exists? - ] [ - 2drop f - ] if ; + over + [ ".factor" vocab-dir+ append-path exists? ] + [ 2drop f ] + if ; SYMBOL: root-cache H{ } clone root-cache set-global + + : find-vocab-root ( vocab -- path/f ) vocab-name dup root-cache get at [ ] [ (find-vocab-root) ] ?if ; @@ -51,26 +54,37 @@ H{ } clone root-cache set-global SYMBOL: load-help? -: load-source ( vocab -- vocab ) - f over set-vocab-source-loaded? - [ vocab-source-path [ parse-file ] [ [ ] ] if* ] keep - t swap set-vocab-source-loaded? - [ % ] [ assert-depth ] if-bootstrapping ; +ERROR: circular-dependency name ; -: load-docs ( vocab -- vocab ) - load-help? get [ - f over set-vocab-docs-loaded? - [ vocab-docs-path [ ?run-file ] when* ] keep - t swap set-vocab-docs-loaded? - ] [ drop ] if ; +>source-loaded? + dup vocab-source-path [ parse-file ] [ [ ] ] if* + [ % ] [ assert-depth ] if-bootstrapping + +done+ >>source-loaded? drop + ] [ ] [ f >>source-loaded? ] cleanup ; + +: load-docs ( vocab -- ) + load-help? get [ + [ + +parsing+ >>docs-loaded? + [ vocab-docs-path [ ?run-file ] when* ] keep + +done+ >>docs-loaded? + ] [ ] [ f >>docs-loaded? ] cleanup + ] when drop ; + +PRIVATE> : require ( vocab -- ) - load-vocab drop ; + [ load-vocab drop ] with-compiler-errors ; + +: reload ( name -- ) + dup vocab + [ [ [ load-source ] [ load-docs ] bi ] with-compiler-errors ] + [ require ] + ?if ; : run ( vocab -- ) dup load-vocab vocab-main [ @@ -81,6 +95,8 @@ SYMBOL: load-help? "To define one, refer to \\ MAIN: help" print ] ?if ; +> +parsing+ eq? [ + dup source-loaded?>> [ dup load-source ] unless + dup docs-loaded?>> [ dup load-docs ] unless + ] unless drop ] [ [ swap add-to-blacklist ] keep rethrow ] recover ; M: vocab-link (load-vocab) @@ -103,19 +120,17 @@ M: string (load-vocab) [ [ - dup vocab-name blacklist get at* [ - rethrow - ] [ - drop - dup find-vocab-root [ - [ (load-vocab) ] with-compiler-errors - ] [ - dup vocab [ drop ] [ no-vocab ] if - ] if + dup vocab-name blacklist get at* [ rethrow ] [ + drop dup find-vocab-root + [ [ (load-vocab) ] with-compiler-errors ] + [ dup vocab [ drop ] [ no-vocab ] if ] + if ] if ] with-compiler-errors ] load-vocab-hook set-global +PRIVATE> + : vocab-where ( vocab -- loc ) vocab-source-path dup [ 1 2array ] when ; diff --git a/core/vocabs/loader/test/f/f.factor b/core/vocabs/loader/test/f/f.factor new file mode 100644 index 0000000000..39d45349e4 --- /dev/null +++ b/core/vocabs/loader/test/f/f.factor @@ -0,0 +1,4 @@ +IN: vocabs.laoder.test.f +USE: vocabs.loader + +"vocabs.loader.test.g" require diff --git a/core/vocabs/loader/test/f/tags.txt b/core/vocabs/loader/test/f/tags.txt new file mode 100644 index 0000000000..6bf68304bb --- /dev/null +++ b/core/vocabs/loader/test/f/tags.txt @@ -0,0 +1 @@ +unportable diff --git a/core/vocabs/loader/test/g/g.factor b/core/vocabs/loader/test/g/g.factor new file mode 100644 index 0000000000..8f124b1935 --- /dev/null +++ b/core/vocabs/loader/test/g/g.factor @@ -0,0 +1,4 @@ +IN: vocabs.loader.test.g +USING: vocabs.loader.test.f namespaces ; + +global [ "vocabs.loader.test.g" inc ] bind diff --git a/core/vocabs/loader/test/g/tags.txt b/core/vocabs/loader/test/g/tags.txt new file mode 100644 index 0000000000..6bf68304bb --- /dev/null +++ b/core/vocabs/loader/test/g/tags.txt @@ -0,0 +1 @@ +unportable diff --git a/core/vocabs/loader/test/h/h.factor b/core/vocabs/loader/test/h/h.factor new file mode 100644 index 0000000000..510062191f --- /dev/null +++ b/core/vocabs/loader/test/h/h.factor @@ -0,0 +1 @@ +USE: vocabs.loader.test.i diff --git a/core/vocabs/loader/test/h/tags.txt b/core/vocabs/loader/test/h/tags.txt new file mode 100644 index 0000000000..6bf68304bb --- /dev/null +++ b/core/vocabs/loader/test/h/tags.txt @@ -0,0 +1 @@ +unportable diff --git a/core/vocabs/loader/test/i/i.factor b/core/vocabs/loader/test/i/i.factor new file mode 100644 index 0000000000..932288daa2 --- /dev/null +++ b/core/vocabs/loader/test/i/i.factor @@ -0,0 +1,2 @@ +IN: vocabs.loader.test.i +USE: vocabs.loader.test.h diff --git a/core/vocabs/loader/test/i/tags.txt b/core/vocabs/loader/test/i/tags.txt new file mode 100644 index 0000000000..6bf68304bb --- /dev/null +++ b/core/vocabs/loader/test/i/tags.txt @@ -0,0 +1 @@ +unportable diff --git a/core/vocabs/vocabs-docs.factor b/core/vocabs/vocabs-docs.factor index 64a5a589dc..2929b50081 100644 --- a/core/vocabs/vocabs-docs.factor +++ b/core/vocabs/vocabs-docs.factor @@ -53,14 +53,6 @@ HELP: vocab-words { $values { "vocab-spec" "a vocabulary specifier" } { "words" "an assoc mapping strings to words" } } { $description "Outputs the words defined in a vocabulary." } ; -HELP: vocab-source-loaded? -{ $values { "vocab-spec" "a vocabulary specifier" } { "?" "a boolean" } } -{ $description "Outputs if the source for this vocubulary has been loaded." } ; - -HELP: vocab-docs-loaded? -{ $values { "vocab-spec" "a vocabulary specifier" } { "?" "a boolean" } } -{ $description "Outputs if the documentation for this vocubulary has been loaded." } ; - HELP: words { $values { "vocab" string } { "seq" "a sequence of words" } } { $description "Outputs a sequence of words defined in the vocabulary, or " { $link f } " if no vocabulary with this name exists." } ; diff --git a/core/vocabs/vocabs.factor b/core/vocabs/vocabs.factor index 1bdbe3ce14..13f79b04ec 100644 --- a/core/vocabs/vocabs.factor +++ b/core/vocabs/vocabs.factor @@ -11,6 +11,11 @@ name words main help source-loaded? docs-loaded? ; +! sources-loaded? slot is one of these two +SYMBOL: +parsing+ +SYMBOL: +running+ +SYMBOL: +done+ + : ( name -- vocab ) \ vocab new swap >>name @@ -52,42 +57,6 @@ M: object vocab-main vocab vocab-main ; M: f vocab-main ; -GENERIC: vocab-source-loaded? ( vocab-spec -- ? ) - -M: vocab vocab-source-loaded? source-loaded?>> ; - -M: object vocab-source-loaded? - vocab vocab-source-loaded? ; - -M: f vocab-source-loaded? ; - -GENERIC: set-vocab-source-loaded? ( ? vocab-spec -- ) - -M: vocab set-vocab-source-loaded? (>>source-loaded?) ; - -M: object set-vocab-source-loaded? - vocab set-vocab-source-loaded? ; - -M: f set-vocab-source-loaded? 2drop ; - -GENERIC: vocab-docs-loaded? ( vocab-spec -- ? ) - -M: vocab vocab-docs-loaded? docs-loaded?>> ; - -M: object vocab-docs-loaded? - vocab vocab-docs-loaded? ; - -M: f vocab-docs-loaded? ; - -GENERIC: set-vocab-docs-loaded? ( ? vocab-spec -- ) - -M: vocab set-vocab-docs-loaded? (>>docs-loaded?) ; - -M: object set-vocab-docs-loaded? - vocab set-vocab-docs-loaded? ; - -M: f set-vocab-docs-loaded? 2drop ; - : create-vocab ( name -- vocab ) dictionary get [ ] cache ;