diff --git a/docs/EN_US/ECLLanguageReference/ECLR_mods/SpecStruc-FuncTion.xml b/docs/EN_US/ECLLanguageReference/ECLR_mods/SpecStruc-FuncTion.xml
index 455f8b3e87e..da9e0492717 100644
--- a/docs/EN_US/ECLLanguageReference/ECLR_mods/SpecStruc-FuncTion.xml
+++ b/docs/EN_US/ECLLanguageReference/ECLR_mods/SpecStruc-FuncTion.xml
@@ -88,69 +88,27 @@
Example:
- EXPORT doProjectChild(parentRecord l,UNSIGNED idAdjust2) := FUNCTION
- newChildRecord copyChild(childRecord l) := TRANSFORM
- SELF.person_id := l.person_id + idAdjust2;
- SELF := l;
- END;
-
- RETURN PROJECT(CHOOSEN(l.children, numChildren),copyChild(LEFT));
-END;
- //And called from
-SELF.children := doProjectChild(l, 99);
-
-//**********************************
-EXPORT isAnyRateGE(STRING1 rate) := FUNCTION
- SetValidRates := ['0','1','2','3','4','5','6','7','8','9'];
- IsValidTradeRate := ValidDate(Trades.trd_drpt) AND
- Trades.trd_rate >= rate AND
- Trades.trd_rate IN SetValidRates;
- ValidPHR := Prev_rate(phr_grid_flag = TRUE,
- phr_rate IN SetValidRates,
- ValidDate(phr_date));
- IsPHRGridRate := EXISTS(ValidPHR(phr_rate >= rate,
- AgeOf(phr_date)<=24));
- IsMaxPHRRate := MAX(ValidPHR(AgeOf(phr_date) > 24),
- Prev_rate.phr_rate) >= rate;
- RETURN IsValidTradeRate OR IsPHRGridRate OR IsMaxPHRRate;
-END;
-
-//*************************************************************
-//a FUNCTION with side-effect Action
-namesTable := FUNCTION
- namesRecord := RECORD
- STRING20 surname;
- STRING10 forename;
- INTEGER2 age := 25;
- END;
- o := OUTPUT('namesTable used by user <x>');
- ds := DATASET([{'x','y',22}],namesRecord);
- RETURN WHEN(ds,O);
-END;
-z := namesTable : PERSIST('z');
- //the PERSIST causes the side-effect action to execute only when the PERSIST is re-built
-
-OUTPUT(z);
-
-//*************************************************************
-//a coordinated set of 3 examples
-
+ //a coordinated set of 3 examples
+IMPORT Std;
NameRec := RECORD
- STRING5 title;
- STRING20 fname;
- STRING20 mname;
- STRING20 lname;
- STRING5 name_suffix;
- STRING3 name_score;
+ STRING5 title := '';
+ STRING20 fname := '';
+ STRING20 mname := '';
+ STRING20 lname := '';
+ STRING5 name_suffix := '';
+ STRING3 name_score := '';
END;
MyRecord := RECORD
UNSIGNED id;
STRING uncleanedName;
NameRec Name;
END;
-ds := DATASET('RTTEST::RowFunctionData', MyRecord, THOR);
+ds := DATASET([{1,'Mr. John Smith JR'},
+ {2,'Mrs. Susie Samantha Jones 3'},
+ {3,'Dr. Fred Taylor SR'}],MyRecord);
+
STRING73 CleanPerson73(STRING inputName) := FUNCTION
- suffix :=[ ' 0',' 1',' 2',' 3',' 4',' 5',' 6',' 7',' 8',' 9',
+ suffix :=[ ' 0',' 1',' 2',' 3',' 4',' 5',' 6',' 7',' 8',' 9',
' J',' JR',' S',' SR'];
InWords := Std.Str.CleanSpaces(inputName);
HasSuffix := InWords[LENGTH(TRIM(InWords))-1 ..] IN suffix;
@@ -175,8 +133,8 @@ STRING73 CleanPerson73(STRING inputName) := FUNCTION
END;
//Example 1 - a transform to create a row from an uncleaned name
-NameRec createRow(string inputName) := TRANSFORM
- cleanedText := LocalAddrCleanLib.CleanPerson73(inputName);
+NameRec createRow(STRING inputName) := TRANSFORM
+ cleanedText := CleanPerson73(inputName);
SELF.title := cleanedText[1..5];
SELF.fname := cleanedText[6..25];
SELF.mname := cleanedText[26..45];
@@ -203,9 +161,9 @@ OUTPUT(y2);
//Example 3 = Encapsulate the transform inside the attribute by
// defining a FUNCTION.
NameRec cleanedName2(STRING inputName) := FUNCTION
-
+
NameRec createRow := TRANSFORM
- cleanedText := LocalAddrCleanLib.CleanPerson73(inputName);
+ cleanedText := CleanPerson73(inputName);
SELF.title := cleanedText[1..5];
SELF.fname := cleanedText[6..25];
SELF.mname := cleanedText[26..45];
@@ -223,21 +181,39 @@ myRecord t3(myRecord l) := TRANSFORM
END;
y3 := PROJECT(ds, t3(LEFT));
-OUTPUT(y3);
+OUTPUT(y3);
+//*************************************************************
//Example using MODULE structure to return multiple values from a FUNCTION
OperateOnNumbers(Number1, Number2) := FUNCTION
result := MODULE
EXPORT Multiplied := Number1 * Number2;
EXPORT Differenced := Number1 - Number2;
- EXPORT Summed := Number1 + Number2;
+ EXPORT Summed := Number1 + Number2;
END;
RETURN result;
END;
-OperateOnNumbers(23,22).Multiplied;
-OperateOnNumbers(23,22).Differenced;
-OperateOnNumbers(23,22).Summed;
+OUTPUT(OperateOnNumbers(23,22).Multiplied); //506
+OUTPUT(OperateOnNumbers(23,22).Differenced); //1
+OUTPUT(OperateOnNumbers(23,22).Summed); //45
+
+//*************************************************************
+//a FUNCTION with side-effect Action
+namesTable := FUNCTION
+ namesRecord := RECORD
+ STRING20 surname;
+ STRING10 forename;
+ INTEGER2 age := 25;
+ END;
+ o := OUTPUT('namesTable used by user <x>');
+ ds1 := DATASET([{'x','y',22}],namesRecord);
+ RETURN WHEN(ds1,o);
+END;
+z := namesTable : PERSIST('z');
+ //the PERSIST causes the side-effect action to execute only when the PERSIST is re-built
+OUTPUT(z);
+
See Also: MODULE Structure,
TRANSFORM Structure, member named MyDefinition, you would reference that
- definition as:
+ definition as
+ MyModule.MyModuleStructure.MyDefinition:
- //MyModule.MyModuleStructure.MyDefinition
-
-MyMod := MODULE
+ MyMod := MODULE
SHARED x := 88;
y := 42;
EXPORT InMod := MODULE //nested MODULE
@@ -290,41 +289,49 @@ IF (doIt, OUTPUT(customerNames.File));
Example:
- EXPORT filterDataset(STRING search, BOOLEAN onlyOldies) := MODULE
+ 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 included := g(surname = search);
+ EXPORT excluded := g(surname <> search);
//EXPORT = visible outside the structure
END;
-filtered := filterDataset('Halliday', TRUE);
-OUTPUT(filtered.included,,NAMED('Included'));
-OUTPUT(filtered.excluded,,NAMED('Excluded'));
-
+filtered1 := filterDataset1('Smith', TRUE);
+OUTPUT(filtered1.included,,NAMED('Included1'));
+OUTPUT(filtered1.excluded,,NAMED('Excluded1'));
+
//same result, different coding style:
-EXPORT filterDataset(BOOLEAN onlyOldies) := MODULE
+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);
+ EXPORT included(STRING search) := g(surname = search);
+ EXPORT excluded(STRING search) := g(surname <> search);
END;
-filtered := filterDataset(TRUE);
-OUTPUT(filtered.included('Halliday'),,NAMED('Included'));
-OUTPUT(filterDataset(true).excluded('Halliday'),,NAMED('Excluded'));
-
-
+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
+ 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;
@@ -332,13 +339,12 @@ OUTPUT(Mod2.func(5)); //result is 15
OUTPUT(Mod3.func(5)); //result is 6
//FORWARD example
-EXPORT MyModule := MODULE, FORWARD
- EXPORT INTEGER foo := bar;
+MyModule := MODULE, FORWARD
+ EXPORT INTEGER foo := bar; //forward reference
EXPORT INTEGER bar := 42;
END;
-MyModule.foo;
-
+OUTPUT(MyModule.foo);
See Also: FUNCTION