Modules are now stored in an assoc, not a hash, to preserve order
parent
e90adcfb43
commit
ebfbc586fe
|
@ -61,7 +61,6 @@ $terpri
|
|||
{ $code "\"concurrency\" require" }
|
||||
"The " { $link require } " word will load all dependencies and source files of the " { $snippet "concurrency" } " module."
|
||||
{ $subsection require }
|
||||
{ $subsection (require) }
|
||||
"To define a new module named " { $snippet "frob" } ", create one of the following two files:"
|
||||
{ $code "contrib/frob.factor" "contrib/frob/load.factor" }
|
||||
"The module definition file should first list all required modules:"
|
||||
|
|
|
@ -18,7 +18,7 @@ H{ } clone c-types set
|
|||
|
||||
H{ } clone vocabularies set
|
||||
H{ } clone class<map set
|
||||
H{ } clone modules set
|
||||
V{ } clone modules set
|
||||
|
||||
vocabularies get [ "syntax" set ] bind
|
||||
|
||||
|
|
|
@ -26,15 +26,15 @@ TUPLE: module name files tests modified ;
|
|||
dupd module-modified hash
|
||||
swap resource-path file-modified number= not ;
|
||||
|
||||
: module-paths ( name seq -- newseq )
|
||||
: prefix-paths ( name seq -- newseq )
|
||||
[ "/" swap append3 ] map-with ;
|
||||
|
||||
C: module ( name files tests -- module )
|
||||
[ >r >r over r> module-paths r> set-module-tests ] keep
|
||||
[ >r dupd module-paths r> set-module-files ] keep
|
||||
[ >r >r over r> prefix-paths r> set-module-tests ] keep
|
||||
[ >r dupd prefix-paths r> set-module-files ] keep
|
||||
[ set-module-name ] keep ;
|
||||
|
||||
: module modules get hash ;
|
||||
: module modules get assoc ;
|
||||
|
||||
: load-module ( name -- )
|
||||
[
|
||||
|
@ -56,19 +56,25 @@ C: module ( name files tests -- module )
|
|||
[ second call ] subset
|
||||
[ first ] map ;
|
||||
|
||||
: add-module ( module -- )
|
||||
dup module-name swap 2array modules get push ;
|
||||
|
||||
: provide ( name files tests -- )
|
||||
[ process-files ] 2apply <module> dup record-modified
|
||||
[ module-files run-resources ] keep
|
||||
dup module-name modules get set-hash ;
|
||||
add-module ;
|
||||
|
||||
: test-module ( name -- ) module module-tests run-tests ;
|
||||
|
||||
: all-modules ( -- seq ) modules get [ second ] map ;
|
||||
|
||||
: all-module-names ( -- seq ) modules get [ first ] map ;
|
||||
|
||||
: test-modules ( -- )
|
||||
modules get hash-values
|
||||
[ module-tests ] map concat run-tests ;
|
||||
all-modules [ module-tests ] map concat run-tests ;
|
||||
|
||||
: modules. ( -- )
|
||||
modules get hash-keys natural-sort [ print ] each ;
|
||||
all-module-names natural-sort [ print ] each ;
|
||||
|
||||
: reload-module ( module -- )
|
||||
dup module-name module-def over modified? [
|
||||
|
@ -80,5 +86,4 @@ C: module ( name files tests -- module )
|
|||
] if ;
|
||||
|
||||
: reload-modules ( -- )
|
||||
modules get hash-values [ reload-module ] each
|
||||
do-parse-hook ;
|
||||
all-modules [ reload-module ] each do-parse-hook ;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
IN: modules
|
||||
USING: help io ;
|
||||
|
||||
HELP: module-paths
|
||||
HELP: prefix-paths
|
||||
{ $values { "name" "a module name string" } { "seq" "a sequence of strings" } { "newseq" "a new sequence of path name strings" } }
|
||||
{ $description "Prepend the location of the module named " { $snippet "name" } " to every file name in " { $snippet "seq" } "." } ;
|
||||
|
||||
|
@ -22,18 +22,14 @@ HELP: modules
|
|||
HELP: load-module
|
||||
{ $values { "name" "a module name string" } }
|
||||
{ $description "Runs the module definition file given by " { $link module-def } ", which loads the module's dependencies and source files." }
|
||||
{ $notes "Unless you want to explicitly reload the sources of a module (for example, after making changes), you should use " { $link (require) } " or " { $link require } " instead." } ;
|
||||
|
||||
HELP: (require)
|
||||
{ $values { "name" "a module name string" } }
|
||||
{ $description "Ensures that a module has been loaded, along with all its dependencies."
|
||||
$terpri
|
||||
"If this module is already listed in the " { $link modules } " hashtable, this word does nothing. Otherwise, it calls " { $link load-module } "." }
|
||||
{ $notes "Module definitions should use the " { $link POSTPONE: REQUIRES: } " parsing word instead. In the listener, the " { $link require } " word might be more useful since it recompiles new words after loading the module." } ;
|
||||
{ $notes "Calling this word directly is rarely necessary. Usually, " { $link require } " is used to load modules and " { $link reload-modules } " is used to reload changed files." } ;
|
||||
|
||||
HELP: require
|
||||
{ $values { "name" "a module name string" } }
|
||||
{ $description "Ensures that a module has been loaded, along with all its dependencies, and recompiles all new words. This word is only for interactive use in the listener; to avoid recompiling words multiple times, any user code which needs to load modules should call " { $link (require) } " instead." } ;
|
||||
{ $description "Ensures that a module has been loaded, along with all its dependencies, and compiles all new words."
|
||||
$terpri
|
||||
"If this module is already listed in the " { $link modules } " hashtable, this word does nothing. Otherwise, it calls " { $link load-module } "." }
|
||||
{ $notes "Module definitions should use the " { $link POSTPONE: REQUIRES: } " parsing word instead. In the listener, the " { $link require } " word might be more useful since it recompiles new words after loading the module." } ;
|
||||
|
||||
HELP: run-resources
|
||||
{ $values { "seq" "a sequence of strings" } }
|
||||
|
|
|
@ -272,7 +272,7 @@ $terpri
|
|||
HELP: REQUIRES:
|
||||
{ $syntax "REQUIRES: modules... ;" }
|
||||
{ $values { "modules" "module name strings" } }
|
||||
{ $description "Loads a list of modules by calling " { $link (require) } " on each one." } ;
|
||||
{ $description "Loads a list of modules by calling " { $link require } " on each one." } ;
|
||||
|
||||
HELP: PROVIDE:
|
||||
{ $syntax "PROVIDE: name files tests ;" }
|
||||
|
|
Loading…
Reference in New Issue