factor/library/modules.factor

90 lines
2.4 KiB
Factor
Raw Normal View History

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-10-19 22:41:20 -04:00
test words strings arrays math help ;
2006-06-18 20:58:11 -04:00
SYMBOL: modules
2006-10-21 02:56:41 -04:00
TUPLE: module name files tests main help ;
: 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
: prefix-paths ( name seq -- newseq )
2006-09-29 23:03:27 -04:00
[ path+ "resource:" swap append ] map-with ;
2006-06-18 20:58:11 -04:00
2006-10-21 02:40:38 -04:00
C: module ( name files tests help -- module )
2006-10-21 02:56:41 -04:00
[ set-module-help ] keep
[ >r >r over r> prefix-paths r> set-module-tests ] keep
[ >r dupd prefix-paths r> set-module-files ] keep
2006-06-18 20:58:11 -04:00
[ set-module-name ] keep ;
M: module <=> [ module-name ] 2apply <=> ;
: module modules get [ module-name = ] find-with nip ;
2006-06-18 20:58:11 -04:00
: load-module ( name -- )
2006-08-12 15:58:32 -04:00
[
"Loading module " write dup write "..." print
2006-09-29 23:03:27 -04:00
[ dup module-def run-file ] assert-depth drop
2006-08-12 15:58:32 -04:00
] no-parse-hook ;
: require ( name -- )
dup module [ drop ] [ load-module ] if do-parse-hook ;
2006-06-18 20:58:11 -04:00
: process-files ( seq -- newseq )
[ dup string? [ [ t ] 2array ] when ] map
[ second call ] subset
2006-10-22 18:08:49 -04:00
0 <column> >array ;
: remove-module ( name -- )
module [ modules get delete ] when* ;
2006-10-21 02:40:38 -04:00
: provide ( name hash -- )
over remove-module [
+files+ get process-files
+tests+ get process-files
+help+ get
] bind <module>
2006-09-29 23:03:27 -04:00
[ module-files run-files ] keep
modules get push ;
2006-06-18 20:58:11 -04:00
2006-09-06 18:48:46 -04: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 ( -- )
modules get [ module-tests ] map concat run-tests ;
2006-09-06 17:19:41 -04:00
: modules. ( -- )
modules get natural-sort
[ [ module-name ] keep write-object terpri ] each ;
: reload-module ( module -- )
2006-09-29 23:03:27 -04:00
dup module-name module-def source-modified? [
module-name load-module
] [
2006-09-29 23:03:27 -04:00
module-files [ source-modified? ] subset run-files
] if ;
: reload-modules ( -- )
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 [
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 )
modules get [ module-help ] map [ ] subset ;