"MODULE - simple module implementation"module
this wordset implements a simple module-system.
the basic module-system is based on the three
words MODULE/END-MODULE/EXPORT - these three were
present TEK' mforth, here the MPE' forth is used
as an example for the naming scheme. This
implementation has also mpe's EXPOSE-MODULE,
and it has a serious form of mpe's REQUIRES
under the name ALSO-MODULE which clarifies that
the search-order is modified. Note also that
pfe defines a REQUIRES in require-ext that works
like INCLUDE-ONCE
EXTENSIONS
create a new WORDLIST with the given name. It
will also have an implicit hidden vocabulary just as
well and all DEFINITIONS will go into that
hidden wordlist. Therefore the old CURRENT is
memorized on the cs-stack.
effectivly, CONTEXT[1] will have the wordlist-id
of the public wordlist "name" and CONTEXT[0] will
have the hidden wordlist contained in "name" - the
hidden wordlist will always be known as HIDDEN' so
that it can be re-referenced without need to use
ALSO just to access a single definition from
just another vocabulary. Note that HIDDEN' is
defined immediate (a VOCABULARY' ) to modify
the ORDER inside a colon definition.
: MODULE
CURRENT @ ( -- old-current )
VOCABULARY
ALSO LATEST NAME> EXECUTE ALSO DEFINITIONS
C" HIDDEN'" $CREATE WORDLIST CONTEXT !
;
| module ordinary primitive
clean up the cs-stack from the last MODULE
definition. Effectivly, MODULE definitions can
be nested.
: END-MODULE ( old-current )
PREVIOUS PREVIOUS CURRENT !
| module ordinary primitive
the named word in the hidden dictionary (i.e.
the wordlist referenced in CURRENT ) is exported
into the public wordlist of it (i.e. which is in
this implementation CONTEXT [1]). The actual
implemenation will create a DEFER -word in the
public wordlist withits parameter area pointing
to the cfa of the hidden implementation.
: EXPORT
CURRENT @ CONTEXT CELL+ @ CURRENT !
DEFER CURRENT !
LATEST COUNT CURRENT @ SEARCH-WORDLIST
IF LATEST NAME> >BODY ! ELSE ABORT" can't find word to export" THEN
;
| module ordinary primitive
affects the search order, ALSO module-wid CONTEXT ! hidden'
: EXPOSE-MODULE
ALSO S" HIDDEN'"
' DUP VOC? ABORT?" is no vocabulary" >VOC
SEARCH-WORDLIST 0= IF " no hidden vocabulary found" THEN
DUP VOC? ABORT?" hidden is no vocabulary" EXECUTE
;
| module ordinary primitive
affects the search-order, ALSO module-wid CONTEXT !
: ALSO-MODULE
' DUP VOC? ABORT?" is no vocabulary"
ALSO EXECUTE
;
| module ordinary primitive
|