Factor out ``no-roots no-prefixes'' into its own word. Add load-root, load-from-root, vocabs-in-root and implement load in terms of load-from-root.
Add error checking for append-vocab-dir and (child-vocabs) in case someone tries to pass them the wrong parameters. Rename: vocab-dir+ to append-vocab-dir Document load-from-root and load-rootdb4
parent
441a8b8926
commit
2ecd513130
|
@ -5,4 +5,4 @@ USING: tools.test vocabs.hierarchy present math vocabs sequences kernel ;
|
|||
[ "Hi" ] [ "Hi" present ] unit-test
|
||||
[ "+" ] [ \ + present ] unit-test
|
||||
[ "kernel" ] [ "kernel" vocab present ] unit-test
|
||||
[ ] [ all-vocabs-recursive no-roots no-prefixes [ present ] map drop ] unit-test
|
||||
[ ] [ all-vocabs-recursive filter-vocabs [ present ] map drop ] unit-test
|
||||
|
|
|
@ -90,7 +90,7 @@ PRIVATE>
|
|||
all-words name-completions ;
|
||||
|
||||
: vocabs-matching ( str -- seq )
|
||||
all-vocabs-recursive no-roots no-prefixes name-completions ;
|
||||
all-vocabs-recursive filter-vocabs name-completions ;
|
||||
|
||||
: chars-matching ( str -- seq )
|
||||
name-map keys dup zip completions ;
|
||||
|
|
|
@ -5,7 +5,7 @@ sequences vocabs.loader ;
|
|||
IN: vocabs.files
|
||||
|
||||
: vocab-tests-file ( vocab -- path )
|
||||
dup "-tests.factor" vocab-dir+ vocab-append-path dup
|
||||
dup "-tests.factor" append-vocab-dir vocab-append-path dup
|
||||
[ dup exists? [ drop f ] unless ] [ drop f ] if ;
|
||||
|
||||
: vocab-tests-dir ( vocab -- paths )
|
||||
|
|
|
@ -1,13 +1,16 @@
|
|||
USING: help.markup help.syntax strings vocabs.loader ;
|
||||
USING: help.markup help.syntax strings vocabs.loader
|
||||
sequences ;
|
||||
IN: vocabs.hierarchy
|
||||
|
||||
ARTICLE: "vocabs.hierarchy" "Vocabulary hierarchy tools"
|
||||
"These tools operate on all vocabularies found in the current set of " { $link vocab-roots } ", loaded or not."
|
||||
"These tools operate on all vocabularies found in the current set of " { $link vocab-roots } ", loaded or not. A prefix is the first part of a vocabulary name."
|
||||
$nl
|
||||
"Loading vocabulary hierarchies:"
|
||||
{ $subsections
|
||||
load
|
||||
load-all
|
||||
load-root
|
||||
load-from-root
|
||||
}
|
||||
"Getting all vocabularies from disk:"
|
||||
{ $subsections
|
||||
|
@ -23,6 +26,7 @@ $nl
|
|||
{ $subsections
|
||||
no-roots
|
||||
no-prefixes
|
||||
filter-vocabs
|
||||
}
|
||||
"Getting " { $link "vocabs.metadata" } " for all vocabularies from disk:"
|
||||
{ $subsections
|
||||
|
@ -40,3 +44,14 @@ HELP: load
|
|||
HELP: load-all
|
||||
{ $description "Load all vocabularies in the source tree." } ;
|
||||
|
||||
HELP: load-from-root
|
||||
{ $values
|
||||
{ "root" "a vocaulary root" } { "prefix" string }
|
||||
}
|
||||
{ $description "Attempts to load all of the vocabularies with a certain prefix from a vocabulary root." } ;
|
||||
|
||||
HELP: load-root
|
||||
{ $values
|
||||
{ "root" "a vocabulary root" }
|
||||
}
|
||||
{ $description "Attempts to load all of the vocabularies in a vocabulary root." } ;
|
||||
|
|
|
@ -24,21 +24,30 @@ M: vocab-prefix vocab-name name>> ;
|
|||
|
||||
: vocab-dir? ( root name -- ? )
|
||||
over
|
||||
[ ".factor" vocab-dir+ append-path exists? ]
|
||||
[ ".factor" append-vocab-dir append-path exists? ]
|
||||
[ 2drop f ]
|
||||
if ;
|
||||
|
||||
ERROR: vocab-root-required root ;
|
||||
|
||||
: ensure-vocab-root ( root -- root )
|
||||
dup vocab-roots get member? [ vocab-root-required ] unless ;
|
||||
|
||||
: ensure-vocab-root/prefix ( root prefix -- root prefix )
|
||||
[ ensure-vocab-root ] [ forbid-absolute-path ] bi* ;
|
||||
|
||||
: (child-vocabs) ( root prefix -- vocabs )
|
||||
ensure-vocab-root/prefix
|
||||
[ vocab-dir append-path dup exists? [ vocab-subdirs ] [ drop { } ] if ]
|
||||
[ nip [ '[ [ _ "." ] dip 3append ] map ] unless-empty ]
|
||||
[ drop '[ _ over vocab-dir? [ >vocab-link ] [ <vocab-prefix> ] if ] map ]
|
||||
2tri ;
|
||||
|
||||
: ((child-vocabs-recursive)) ( root name -- )
|
||||
: ((child-vocabs-recursive)) ( root prefix -- )
|
||||
dupd vocab-name (child-vocabs)
|
||||
[ dup , ((child-vocabs-recursive)) ] with each ;
|
||||
|
||||
: (child-vocabs-recursive) ( root name -- seq )
|
||||
: (child-vocabs-recursive) ( root prefix -- seq )
|
||||
[ ((child-vocabs-recursive)) ] { } make ;
|
||||
|
||||
: no-rooted ( seq -- seq' ) [ find-vocab-root not ] filter ;
|
||||
|
@ -73,6 +82,9 @@ PRIVATE>
|
|||
|
||||
: no-roots ( assoc -- seq ) values concat ;
|
||||
|
||||
: filter-vocabs ( assoc -- seq )
|
||||
no-roots no-prefixes members ;
|
||||
|
||||
: child-vocabs ( prefix -- assoc )
|
||||
[ [ vocab-roots get ] dip '[ dup _ (child-vocabs) ] { } map>assoc ]
|
||||
[ unrooted-child-vocabs [ vocab ] map f swap 2array ]
|
||||
|
@ -90,27 +102,49 @@ MEMO: all-vocabs-recursive ( -- assoc )
|
|||
"" child-vocabs-recursive ;
|
||||
|
||||
: all-vocab-names ( -- seq )
|
||||
all-vocabs-recursive no-roots no-prefixes [ vocab-name ] map ;
|
||||
all-vocabs-recursive filter-vocabs [ vocab-name ] map ;
|
||||
|
||||
: child-vocab-names ( prefix -- seq )
|
||||
child-vocabs no-roots no-prefixes [ vocab-name ] map ;
|
||||
child-vocabs filter-vocabs [ vocab-name ] map ;
|
||||
|
||||
<PRIVATE
|
||||
|
||||
: collect-vocabs ( quot -- seq )
|
||||
[ all-vocabs-recursive no-roots no-prefixes ] dip
|
||||
[ all-vocabs-recursive filter-vocabs ] dip
|
||||
gather natural-sort ; inline
|
||||
|
||||
: maybe-include-root/prefix ( root prefix -- vocab-link/f )
|
||||
over [
|
||||
[ find-vocab-root = ] keep swap
|
||||
] [
|
||||
nip dup find-vocab-root
|
||||
] if [ >vocab-link ] [ drop f ] if ;
|
||||
|
||||
PRIVATE>
|
||||
|
||||
: (load) ( prefix -- failures )
|
||||
[ child-vocabs-recursive no-roots no-prefixes ]
|
||||
[ dup find-vocab-root [ >vocab-link prefix ] [ drop ] if ] bi
|
||||
filter-don't-load
|
||||
: vocabs-in-root/prefix ( root prefix -- seq )
|
||||
[ (child-vocabs-recursive) ]
|
||||
[ maybe-include-root/prefix [ prefix ] when* ] 2bi ;
|
||||
|
||||
: vocabs-in-root ( root -- seq )
|
||||
"" vocabs-in-root/prefix ;
|
||||
|
||||
: (load-from-root) ( root prefix -- failures )
|
||||
vocabs-in-root/prefix
|
||||
[ don't-load? not ] filter no-prefixes
|
||||
require-all ;
|
||||
|
||||
: load-from-root ( root prefix -- )
|
||||
(load-from-root) load-failures. ;
|
||||
|
||||
: load-root ( root -- )
|
||||
"" load-from-root ;
|
||||
|
||||
: (load) ( prefix -- failures )
|
||||
[ vocab-roots get ] dip '[ _ (load-from-root) ] map concat ;
|
||||
|
||||
: load ( prefix -- )
|
||||
(load) load-failures. ;
|
||||
(load) [ load-failures. ] each ;
|
||||
|
||||
: load-all ( -- )
|
||||
"" load ;
|
||||
|
|
|
@ -45,23 +45,28 @@ PRIVATE>
|
|||
: vocab-dir ( vocab -- dir )
|
||||
vocab-name { { CHAR: . CHAR: / } } substitute ;
|
||||
|
||||
: vocab-dir+ ( vocab str/f -- path )
|
||||
[ vocab-name "." split ] dip
|
||||
ERROR: absolute-path-forbidden path ;
|
||||
|
||||
: forbid-absolute-path ( str -- str )
|
||||
dup absolute-path? [ absolute-path-forbidden ] when ;
|
||||
|
||||
: append-vocab-dir ( vocab str/f -- path )
|
||||
[ vocab-name forbid-absolute-path "." split ] dip
|
||||
[ [ dup last ] dip append suffix ] when*
|
||||
"/" join ;
|
||||
|
||||
: find-vocab-root ( vocab -- path/f )
|
||||
vocab-name dup root-cache get at
|
||||
[ ] [ ".factor" vocab-dir+ find-root-for ] ?if ;
|
||||
[ ] [ ".factor" append-vocab-dir find-root-for ] ?if ;
|
||||
|
||||
: vocab-append-path ( vocab path -- newpath )
|
||||
swap find-vocab-root dup [ prepend-path ] [ 2drop f ] if ;
|
||||
|
||||
: vocab-source-path ( vocab -- path/f )
|
||||
dup ".factor" vocab-dir+ vocab-append-path ;
|
||||
dup ".factor" append-vocab-dir vocab-append-path ;
|
||||
|
||||
: vocab-docs-path ( vocab -- path/f )
|
||||
dup "-docs.factor" vocab-dir+ vocab-append-path ;
|
||||
dup "-docs.factor" append-vocab-dir vocab-append-path ;
|
||||
|
||||
SYMBOL: load-help?
|
||||
|
||||
|
|
|
@ -8,6 +8,3 @@ IN: vocabs.tests
|
|||
[ t ] [ "" "io.files" child-vocab? ] unit-test
|
||||
[ t ] [ "io" "io.files" child-vocab? ] unit-test
|
||||
[ f ] [ "io.files" "io" child-vocab? ] unit-test
|
||||
|
||||
[ t ] [ "io.files" "io" parent-vocab? ] unit-test
|
||||
[ f ] [ "io" "io.files" parent-vocab? ] unit-test
|
||||
|
|
|
@ -111,12 +111,6 @@ ERROR: no-vocab name ;
|
|||
: child-vocabs ( vocab -- seq )
|
||||
vocab-name vocabs [ child-vocab? ] with filter ;
|
||||
|
||||
: parent-vocab? ( suffix name -- ? )
|
||||
swap child-vocab? ;
|
||||
|
||||
: parent-vocabs ( vocab -- seq )
|
||||
vocab-name vocabs [ parent-vocab? ] with filter ;
|
||||
|
||||
GENERIC: >vocab-link ( name -- vocab )
|
||||
|
||||
M: vocab-spec >vocab-link ;
|
||||
|
|
|
@ -23,7 +23,7 @@ M: readline-reader prompt.
|
|||
all-words [ name>> ] map ;
|
||||
|
||||
: vocab-names ( -- strs )
|
||||
all-vocabs-recursive no-roots no-prefixes [ name>> ] map ;
|
||||
all-vocabs-recursive filter-vocabs [ name>> ] map ;
|
||||
|
||||
: prefixed-words ( prefix -- words )
|
||||
'[ _ head? ] word-names swap filter ;
|
||||
|
|
Loading…
Reference in New Issue