2006-06-18 20:58:11 -04:00
|
|
|
! Copyright (C) 2006 Slava Pestov.
|
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
|
|
|
IN: modules
|
2006-09-06 18:06:11 -04:00
|
|
|
USING: hashtables io kernel namespaces parser sequences
|
2006-11-10 22:49:03 -05:00
|
|
|
test words strings arrays math help prettyprint-internals
|
2006-11-18 03:51:34 -05:00
|
|
|
definitions styles ;
|
2006-06-18 20:58:11 -04:00
|
|
|
|
2006-09-06 19:49:48 -04:00
|
|
|
SYMBOL: modules
|
|
|
|
|
|
2006-11-10 22:49:03 -05:00
|
|
|
TUPLE: module name loc files tests help main ;
|
2006-09-06 19:49:48 -04:00
|
|
|
|
2006-11-17 01:40:23 -05:00
|
|
|
! For presentations
|
|
|
|
|
TUPLE: module-link name ;
|
|
|
|
|
|
|
|
|
|
M: module-link module-name module-link-name ;
|
|
|
|
|
|
2006-09-06 19:49:48 -04:00
|
|
|
: module-def ( name -- path )
|
2006-09-29 23:03:27 -04:00
|
|
|
"resource:" over ".factor" append3
|
|
|
|
|
dup ?resource-path exists? [
|
|
|
|
|
nip
|
|
|
|
|
] [
|
|
|
|
|
drop "resource:" swap "/load.factor" append3
|
|
|
|
|
] if ;
|
2006-06-18 20:58:11 -04:00
|
|
|
|
2006-10-28 02:44:12 -04:00
|
|
|
: module modules get [ module-name = ] find-with nip ;
|
2006-06-18 20:58:11 -04:00
|
|
|
|
2006-11-10 22:49:03 -05:00
|
|
|
: process-files ( name seq -- newseq )
|
2006-09-06 17:01:38 -04:00
|
|
|
[ dup string? [ [ t ] 2array ] when ] map
|
|
|
|
|
[ second call ] subset
|
2006-11-10 22:49:03 -05:00
|
|
|
0 <column> >array
|
|
|
|
|
[ path+ "resource:" swap append ] map-with ;
|
|
|
|
|
|
|
|
|
|
: module-files* ( module -- seq )
|
|
|
|
|
dup module-name swap module-files process-files ;
|
|
|
|
|
|
2006-11-18 03:51:34 -05:00
|
|
|
: load-module ( name -- )
|
|
|
|
|
[
|
|
|
|
|
"Loading module " write dup write "..." print
|
|
|
|
|
[ dup module-def run-file ] assert-depth drop
|
|
|
|
|
] no-parse-hook ;
|
|
|
|
|
|
|
|
|
|
: reload-module ( module -- )
|
|
|
|
|
dup module-name module-def source-modified? [
|
|
|
|
|
module-name load-module
|
|
|
|
|
] [
|
|
|
|
|
module-files* [ source-modified? ] subset run-files
|
|
|
|
|
] if ;
|
|
|
|
|
|
|
|
|
|
: require ( name -- )
|
|
|
|
|
dup module
|
|
|
|
|
[ reload-module ] [ load-module ] ?if
|
|
|
|
|
do-parse-hook ;
|
|
|
|
|
|
2006-11-10 22:49:03 -05:00
|
|
|
: module-tests* ( module -- seq )
|
|
|
|
|
dup module-name swap module-tests process-files ;
|
2006-09-06 17:01:38 -04:00
|
|
|
|
2006-09-08 21:12:18 -04:00
|
|
|
: remove-module ( name -- )
|
2006-10-28 02:44:12 -04:00
|
|
|
module [ modules get delete ] when* ;
|
2006-09-08 21:12:18 -04:00
|
|
|
|
2006-11-10 22:49:03 -05:00
|
|
|
: alist>module ( name loc hash -- module )
|
|
|
|
|
alist>hash [
|
|
|
|
|
+files+ get +tests+ get +help+ get
|
|
|
|
|
] bind f <module> ;
|
|
|
|
|
|
|
|
|
|
: module>alist ( module -- hash )
|
|
|
|
|
[
|
|
|
|
|
+files+ over module-files 2array ,
|
|
|
|
|
+tests+ over module-tests 2array ,
|
|
|
|
|
+help+ swap module-help 2array ,
|
|
|
|
|
] { } make ;
|
|
|
|
|
|
|
|
|
|
: provide ( name loc hash -- )
|
|
|
|
|
pick remove-module
|
|
|
|
|
alist>module
|
|
|
|
|
[ module-files* run-files ] keep
|
2006-10-28 02:44:12 -04:00
|
|
|
modules get push ;
|
2006-06-18 20:58:11 -04:00
|
|
|
|
2006-11-10 22:49:03 -05:00
|
|
|
: test-module ( name -- ) module module-tests* run-tests ;
|
2006-06-18 21:31:20 -04:00
|
|
|
|
2006-09-06 18:48:46 -04:00
|
|
|
: test-modules ( -- )
|
2006-11-10 22:49:03 -05:00
|
|
|
modules get [ module-tests* ] map concat run-tests ;
|
2006-09-06 17:19:41 -04:00
|
|
|
|
2006-09-06 19:49:48 -04:00
|
|
|
: reload-modules ( -- )
|
2006-10-28 02:44:12 -04:00
|
|
|
modules get [ reload-module ] each do-parse-hook ;
|
2006-10-19 22:41:20 -04:00
|
|
|
|
|
|
|
|
: run-module ( name -- )
|
2006-10-19 22:44:40 -04:00
|
|
|
dup require
|
2006-10-19 22:41:20 -04:00
|
|
|
dup module module-main [
|
2006-10-26 01:17:40 -04:00
|
|
|
assert-depth
|
2006-10-19 22:41:20 -04:00
|
|
|
] [
|
|
|
|
|
"The module " write write
|
|
|
|
|
" does not define an entry point." print
|
|
|
|
|
"To define one, see the documentation for the " write
|
|
|
|
|
\ MAIN: ($link) " word." print
|
|
|
|
|
] ?if ;
|
2006-10-21 02:57:41 -04:00
|
|
|
|
|
|
|
|
: modules-help ( -- seq )
|
2006-10-28 02:44:12 -04:00
|
|
|
modules get [ module-help ] map [ ] subset ;
|
2006-11-10 22:49:03 -05:00
|
|
|
|
2006-11-18 03:51:34 -05:00
|
|
|
M: module synopsis*
|
|
|
|
|
\ PROVIDE: pprint-word
|
|
|
|
|
[ module-name ] keep presented associate styled-text ;
|
2006-11-10 22:49:03 -05:00
|
|
|
|
|
|
|
|
M: module definition module>alist t ;
|
|
|
|
|
|
|
|
|
|
M: module where* module-loc ;
|
2006-11-17 01:40:23 -05:00
|
|
|
|
|
|
|
|
: module-dir? ( path -- ? )
|
|
|
|
|
"load.factor" path+ resource-path exists? ;
|
|
|
|
|
|
|
|
|
|
: (available-modules) ( path -- )
|
|
|
|
|
dup directory [ path+ ] map-with
|
|
|
|
|
dup [ module-dir? ] subset %
|
|
|
|
|
[ (available-modules) ] each ;
|
|
|
|
|
|
|
|
|
|
: small-modules ( path -- seq )
|
|
|
|
|
dup resource-path directory [ path+ ] map-with
|
|
|
|
|
[ ".factor" tail? ] subset
|
|
|
|
|
[ ".factor" ?tail drop ] map ;
|
|
|
|
|
|
|
|
|
|
: available-modules ( -- seq )
|
|
|
|
|
[
|
|
|
|
|
"library" (available-modules)
|
|
|
|
|
"contrib" (available-modules)
|
|
|
|
|
"contrib" small-modules %
|
|
|
|
|
"examples" (available-modules)
|
|
|
|
|
"examples" small-modules %
|
|
|
|
|
] { } make natural-sort
|
|
|
|
|
[ dup module [ ] [ <module-link> ] ?if ] map ;
|
|
|
|
|
|
|
|
|
|
: module-string ( obj -- str )
|
|
|
|
|
dup module-name swap module? [ " (loaded)" append ] when ;
|
|
|
|
|
|
|
|
|
|
: modules. ( -- )
|
|
|
|
|
available-modules
|
|
|
|
|
[ [ module-string ] keep write-object terpri ] each ;
|