A MODULE with the LIBRARY option defines a related set of functions meant to be used as a query library (see the LIBRARY function and BUILD action discussions). There are several restrictions on what may be included in a query library. They are:
It may not contain side-effect actions (like OUTPUT or BUILD)
It may not contain definitions with workflow services attached to them (such as PERSIST, STORED, SUCCESS, etc.)
It may only EXPORT:
And may NOT export:
Actions (like OUTPUT or BUILD)
TRANSFORM functions
Other MODULE structures
MACRO definitions
Example:
namesRecord := RECORD
STRING20 surname;
STRING10 forename;
INTEGER2 age := 25;
END;
namesTable := DATASET([{'Smith','Sue',72},
{'Jones','Joe',32},
{'Jones','Fred',82}],namesRecord);
filterDataset1(STRING search, BOOLEAN onlyOldies) := MODULE
f := namesTable; //local to the "g" definition
SHARED g := IF (onlyOldies, f(age >= 65), f);
//SHARED = visible only within the structure
EXPORT included := g(surname = search);
EXPORT excluded := g(surname <> search);
//EXPORT = visible outside the structure
END;
filtered1 := filterDataset1('Smith', TRUE);
OUTPUT(filtered1.included,,NAMED('Included1'));
OUTPUT(filtered1.excluded,,NAMED('Excluded1'));
//same result, different coding style:
filterDataset2(BOOLEAN onlyOldies) := MODULE
f := namesTable;
SHARED g := IF (onlyOldies, f(age >= 65), f);
EXPORT included(STRING search) := g(surname = search);
EXPORT excluded(STRING search) := g(surname <> search);
END;
filtered2 := filterDataset2(TRUE);
OUTPUT(filtered2.included('Smith'),,NAMED('Included2'));
OUTPUT(filterDataset2(true).excluded('Smith'),,NAMED('Excluded2'));
//VIRTUAL examples
Mod1 := MODULE,VIRTUAL //a fully abstract module
EXPORT val := 1;
EXPORT func(INTEGER sc) := val * sc;
END;
Mod2 := MODULE(Mod1) //instance
EXPORT val := 3; //a concete member, overriding default value
//while func remains abstract
END;
Mod3 := MODULE(Mod1) //a fully concete instance
EXPORT func(INTEGER sc) := val + sc; //overrides inherited func
END;
OUTPUT(Mod2.func(5)); //result is 15
OUTPUT(Mod3.func(5)); //result is 6
//FORWARD example
MyModule := MODULE, FORWARD
EXPORT INTEGER foo := bar; //forward reference
EXPORT INTEGER bar := 42;
END;
OUTPUT(MyModule.foo);
See Also: FUNCTION Structure, Definition Visibility, INTERFACE Structure, LIBRARY, BUILD