factor/core/modules.factor

80 lines
2.0 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
words strings arrays math help errors ;
2006-06-18 20:58:11 -04:00
SYMBOL: modules
TUPLE: module name loc directory files tests help main ;
: module-def ( name -- path )
"resource:" over "/load.factor" 3append
2006-09-29 23:03:27 -04:00
dup ?resource-path exists? [
nip
] [
drop "resource:" swap ".factor" 3append
2006-09-29 23:03:27 -04:00
] if ;
2006-06-18 20:58:11 -04:00
: module modules get [ module-name = ] find-with nip ;
2006-06-18 20:58:11 -04:00
: process-files ( name seq -- newseq )
[ dup string? [ [ t ] 2array ] when ] map
[ second call ] subset
0 <column> >array
[ path+ "resource:" swap append ] map-with ;
: module-files* ( module -- seq )
dup module-directory swap module-files process-files ;
: loading-module ( name -- )
"quiet" get [
drop
] [
2006-12-11 02:47:57 -05:00
"Loading module " write print flush
] if ;
2006-11-18 03:51:34 -05:00
: load-module ( name -- )
[
dup loading-module
2006-11-18 03:51:34 -05:00
[ 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 ;
: reload-modules ( -- )
modules get [ reload-module ] each do-parse-hook ;
2006-11-18 03:51:34 -05:00
: require ( name -- )
dup module [ drop ] [ load-module ] if do-parse-hook ;
2006-11-18 03:51:34 -05:00
: remove-module ( name -- )
module [ modules get delete ] when* ;
: alist>module ( name loc hash -- module )
alist>hash [
+directory+ get [ over ] unless*
+files+ get
+tests+ get
+help+ get
] bind f <module> ;
: module>alist ( module -- hash )
[
+directory+ over module-directory 2array ,
+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
modules get push ;