compiler.crossref: better way to store the dependencies on words

char-rename
Björn Lindqvist 2016-11-28 04:13:58 +01:00
parent e842e41f49
commit d6eb6f2c76
3 changed files with 32 additions and 11 deletions

View File

@ -7,3 +7,7 @@ HELP: compiled-crossref
HELP: load-dependencies
{ $values { "word" word } { "assoc" assoc } }
{ $description "Creates an assoc where keys are the words the word depends on and values are the dependency type." } ;
HELP: store-dependencies
{ $values { "word" word } { "assoc" assoc } }
{ $description "Stores the dependencies in 'assoc' in the word attributes named \"effect-dependencies\", \"conditional-dependencies\" and \"definition-dependencies\"." } ;

View File

@ -1,5 +1,5 @@
USING: compiler.crossref fry kernel namespaces sequences
stack-checker.dependencies tools.test vocabs words ;
USING: accessors assocs compiler.crossref fry kernel namespaces
sequences stack-checker.dependencies tools.test vocabs words ;
IN: compiler.crossref.tests
! Dependencies of all words should always be satisfied unless we're
@ -51,3 +51,22 @@ IN: compiler.crossref.tests
} [
{ 1 2 } { 3 4 } { 5 6 } join-dependencies
] unit-test
! store-dependencies
: setup-deps ( -- assoc )
H{
{ 20 +definition+ }
{ 30 +conditional+ }
{ 40 +effect+ }
{ 50 +effect+ }
} ;
SYMBOL: foo
{
{ 20 } { 40 50 } { 30 }
} [
foo [ setup-deps store-dependencies ] keep props>>
[ "definition-dependencies" of ]
[ "effect-dependencies" of ]
[ "conditional-dependencies" of ] tri
] unit-test

View File

@ -43,17 +43,15 @@ generic-call-site-crossref [ H{ } clone ] initialize
: set-generic-call-sites ( word alist -- )
concat f like "generic-call-sites" set-word-prop ;
: split-dependencies ( assoc -- effect-deps cond-deps def-deps )
[ nip +effect+ eq? ] assoc-partition
[ nip +conditional+ eq? ] assoc-partition ;
: (store-dependencies) ( word assoc prop -- )
[ keys f like ] dip set-word-prop ;
: store-dependencies-of-type ( word assoc symbol prop-name -- )
[ rot '[ nip _ = ] assoc-filter keys ] dip set-word-prop ;
: store-dependencies ( word assoc -- )
split-dependencies
"effect-dependencies" "conditional-dependencies" "definition-dependencies"
[ (store-dependencies) ] tri-curry@ tri-curry* tri ;
{
{ +effect+ "effect-dependencies" }
{ +conditional+ "conditional-dependencies" }
{ +definition+ "definition-dependencies" }
} [ store-dependencies-of-type ] 2with assoc-each ;
: add-xref ( word dependencies crossref -- )
rot '[