"MODULE - simple module implementation"

module EXTENSIONS
* MODULE ( "name" -- old-current )

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 !
 ;

EXTENSIONS module ordinary primitive

* END-MODULE ( old-current -- )

clean up the cs-stack from the last MODULE
definition. Effectivly, MODULE definitions can
be nested.
 : END-MODULE ( old-current )
   PREVIOUS PREVIOUS CURRENT ! 

EXTENSIONS module ordinary primitive

* EXPORT ( old-current "name" -- old-current )

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
 ;

EXTENSIONS module ordinary primitive

* EXPOSE-MODULE ( "name" -- )

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
 ;

EXTENSIONS module ordinary primitive

* ALSO-MODULE ( "name" -- )

affects the search-order, ALSO module-wid CONTEXT !
 : ALSO-MODULE
   ' DUP VOC? ABORT?" is no vocabulary" 
   ALSO EXECUTE
 ;

EXTENSIONS module ordinary primitive