SlideShare a Scribd company logo
Ring Documentation, Release 1.5.3
Func main
e1 = new Employee {
Name = "test"
age = 20
job = "programmer"
salary = 20000000
print()
}
Class Human
Name Age
func print
see "Name : " + name + nl + "Age : " + age + nl
Class Employee from Human
Job Salary
func print
super.print()
see "Job : " + job + nl + "Salary : " + salary + nl
Output:
Name : test
Age : 20
Job : programmer
Salary : 20000000
39.8 Dynamic Attributes
We can write instructions after the class name to be executed when we create new objects
Example:
o1 = new dynamicClass
see o1.var5 + nl # output 5
Class DynamicClass
for x = 1 to 10
cStr = "var" + x + " = " + x
eval(cStr)
next
Tip: in the previous example var1, var2, ..., var10 will be defined as attributes.
Tip: The problem with the previous example is that x and cStr will be defined as attributes too!
Note: we can write class definitions inside a string then using eval() we can execute the string to define the classes
39.9 Packages
We can create a package (a group of classes under a common name) using the next syntax
39.8. Dynamic Attributes 275
Ring Documentation, Release 1.5.3
package PackageName
Class Class1
...
Class Class2
...
Class Class3
...
...
Example
o1 = new System.output.console
o1.print("Hello World")
Package System.Output
Class Console
Func Print cText
see cText + nl
Note: we can use the dot operator as part of the package name
Instead of typing the long name PackageName.ClassName we can use the import command
When we import a package, we can use any class inside this package directly.
Example
import system.output
o1 = new console {
print("Hello World")
}
Package System.Output
Class Console
Func Print cText
see cText + nl
39.10 Printing Objects
We can print the object state (attributes and values) using the see command.
Example:
see new point { x=10 y=20 z=30 }
class point x y z
Output:
x: 10.000000
y: 20.000000
z: 30.000000
39.11 Find() and List of Objects
We can use the find() function to search inside a list of objects.
Syntax:
39.10. Printing Objects 276
Ring Documentation, Release 1.5.3
Find(List,ItemValue,nColumn,cAttribute) ---> Item Index
Example:
myList1 = [new Company {position=3 name="Mahmoud" symbol="MHD"},
new Company {position=2 name="Bert" symbol="BRT"},
new Company {position=1 name="Ring" symbol="RNG"}
]
see find(mylist1,"Bert",1,"name") + nl
see find(mylist1,"Ring",1,"name") + nl
see find(mylist1,"Mahmoud",1,"name") + nl
see find(mylist1,"RNG",1,"symbol") + nl
see find(mylist1,"MHD",1,"symbol") + nl
see find(mylist1,"BRT",1,"symbol") + nl
see find(mylist1,3,1,"position") + nl
see find(mylist1,1,1,"position") + nl
see "Other" + nl
see find(mylist1,"test",1,"name") + nl
see find(mylist1,"test",0,"name") + nl
see find(mylist1,"test",5,"name") + nl
class company position name symbol
Output:
2
3
1
3
1
2
1
3
Other
0
0
0
39.12 Sort() and list of objects
We can sort a list of objects based on an object attribute using the Sort() function.
Syntax:
Sort(List,nColumn,cAttribute) ---> Sorted List based on Object Attribute
Example:
myList1 = [
new Company {position=3 name="Mahmoud" symbol="MHD"},
new Company {position=2 name="Bert" symbol="BRT"},
new Company {position=8 name="Charlie" symbol="CHR"},
new Company {position=6 name="Easy" symbol="FEAS"},
new Company {position=7 name="Fox" symbol="EFOX"},
new Company {position=5 name="Dog" symbol="GDOG"},
new Company {position=4 name="George" symbol="DGRG"},
39.12. Sort() and list of objects 277
Ring Documentation, Release 1.5.3
new Company {position=1 name="Ring" symbol="RNG"}
]
see sort(mylist1,1,"name")
see copy("*",70) + nl
see sort(mylist1,1,"symbol")
see copy("*",70) + nl
see sort(mylist1,1,"position")
class company position name symbol
Output:
position: 2.000000
name: Bert
symbol: BRT
position: 8.000000
name: Charlie
symbol: CHR
position: 5.000000
name: Dog
symbol: GDOG
position: 6.000000
name: Easy
symbol: FEAS
position: 7.000000
name: Fox
symbol: EFOX
position: 4.000000
name: George
symbol: DGRG
position: 3.000000
name: Mahmoud
symbol: MHD
position: 1.000000
name: Ring
symbol: RNG
**********************************************************************
position: 2.000000
name: Bert
symbol: BRT
position: 8.000000
name: Charlie
symbol: CHR
position: 4.000000
name: George
symbol: DGRG
position: 7.000000
name: Fox
symbol: EFOX
position: 6.000000
name: Easy
symbol: FEAS
position: 5.000000
name: Dog
symbol: GDOG
position: 3.000000
name: Mahmoud
39.12. Sort() and list of objects 278
Ring Documentation, Release 1.5.3
symbol: MHD
position: 1.000000
name: Ring
symbol: RNG
**********************************************************************
position: 1.000000
name: Ring
symbol: RNG
position: 2.000000
name: Bert
symbol: BRT
position: 3.000000
name: Mahmoud
symbol: MHD
position: 4.000000
name: George
symbol: DGRG
position: 5.000000
name: Dog
symbol: GDOG
position: 6.000000
name: Easy
symbol: FEAS
position: 7.000000
name: Fox
symbol: EFOX
position: 8.000000
name: Charlie
symbol: CHR
39.13 Using Self.Attribute and Self.Method()
Inside the class region (After the class name and before any method) and the class methods we can use self.attribute
and self.method()
Class Point
self.x = 10
self.y = 20
self.z = 30
func print
see self.x + nl + self.y + nl + self.z + nl
Note: using self.attribute in the class region to define the class attribute protect the class attributes from conflict with
global variables.
Tip: if you typed the class attributes with self.attribute and there are a global variable with the same name it will be
used and the attribute will not be defined.
Check the “Scope Rules” chapter to know about the conflict between the global variable name and the attribute name
Whay this may happens?
Because
• Because in the class region we can access global variables.
39.13. Using Self.Attribute and Self.Method() 279
Ring Documentation, Release 1.5.3
• Before defining any variable, Ring try to find the variable and use it if it’s found.
Note: Try to avoid the global variables, use the main function and start their names with $
Tip: In large programs protect your classes and define their members using self.attribute
39.14 Using This.Attribute and This.Method()
Inside class methods we have access to the object scope directly. we don’t need to use Self.attribute or Self.method to
read/write attribute and call methods.
But we can use braces {} while we are inside methods to access another object, In this case the current object scope
will be changed while we are inside the brace.
How we can get access to our class attributes and methods while we are inside braces?
This can be done using This.Attribute and This.Method()
Example:
new point
class point
x=10 y=20 z=30
print()
func print
new UI {
display(this.x,this.y,this.z)
}
Class UI
func display x,y,z
see x + nl + y + nl + z + nl
39.14. Using This.Attribute and This.Method() 280
CHAPTER
FORTY
FUNCTIONAL PROGRAMMING
In previous chapters we learned about Functions and Recursion.
In this chapter we are going to learn about more Functional Programming (FP) concepts like
• Pure Functions
• First-class functions
• Higher-order functions
• Anonymous and nested functions.
• Equality of functions
40.1 Pure Functions
We can create pure functions (functions that doesn’t change the state) by the help of the assignment operator to copy
variables (Lists & Objects) by value to create new variables instead of working on the original data that are passed to
the function by reference.
Example:
Func Main
aList = [1,2,3,4,5]
aList2 = square(aList)
see "aList" + nl
see aList
see "aList2" + nl
see aList2
Func Square aPara
a1 = aPara # copy the list
for x in a1
x *= x
next
return a1 # return new list
Output:
aList
1
2
3
4
5
281
Ring Documentation, Release 1.5.3
aList2
1
4
9
16
25
40.2 First-class Functions
Functions inside the Ring programming language are first-class citizens, you can pass functions as parameters, return
them as value or store them in variables.
We can pass/return the function by typing the function name as literal like “FunctionName” or :FunctionName for
example.
We can pass/return functions using the variable that contains the function name.
We can call function from variables contains the function name using the Call command
Syntax:
Call Variable([Parameters])
Example:
Func Main
see "before test2()" + nl
f = Test2(:Test)
see "after test2()" + nl
call f()
Func Test
see "Message from test!" + nl
Func Test2 f1
call f1()
See "Message from test2!" + nl
return f1
Output:
before test2()
Message from test!
Message from test2!
after test2()
Message from test!
40.3 Higher-order Functions
Higher-order functions are the functions that takes other functions as parameters.
Example:
Func Main
times(5,:test)
40.2. First-class Functions 282
Ring Documentation, Release 1.5.3
Func Test
see "Message from the test function!" + nl
Func Times nCount,F
for x = 1 to nCount
Call F()
next
Output:
Message from the test function!
Message from the test function!
Message from the test function!
Message from the test function!
Message from the test function!
40.4 Anonymous and Nested Functions
Anonymous Functions are functions without names that can be passed as parameters to other functions or stored in
variables.
Syntax:
Func [Parameters] { [statements] }
Example:
test( func x,y {
see "hello" + nl
see "Sum : " + (x+y) + nl
} )
new great { f1() }
times(3, func { see "hello world" + nl } )
func test x
call x(3,3)
see "wow!" + nl
func times n,x
for t=1 to n
call x()
next
Class great
func f1
f2( func { see "Message from f1" + nl } )
func f2 x
call x()
Output:
hello
Sum : 6
40.4. Anonymous and Nested Functions 283
Ring Documentation, Release 1.5.3
wow!
Message from f1
hello world
hello world
hello world
Example:
Func Main
aList = [1,2,3,4]
Map (aList , func x {
return x*x
} )
see aList
aList = [4,9,14,25]
Map(aList, :myfilter )
see aList
aList = [11,12,13,14]
Map (aList , func x {
if x%2=0
return "even"
else
return "odd"
ok
})
see aList
Func myfilter x
if x = 9
return "True"
else
return "False"
ok
Func Map aList,cFunc
for x in aList
x = call cFunc(x)
next
Output:
1
4
9
16
False
True
False
False
odd
even
odd
even
40.5 Equality of functions
We can test if function = function or not using the ‘=’ or ‘!=’ operators
40.5. Equality of functions 284

More Related Content

PDF
The Ring programming language version 1.5.4 book - Part 31 of 185
PDF
The Ring programming language version 1.3 book - Part 22 of 88
PDF
The Ring programming language version 1.9 book - Part 39 of 210
PDF
The Ring programming language version 1.4 book - Part 9 of 30
PDF
The Ring programming language version 1.5.4 book - Part 33 of 185
PDF
The Ring programming language version 1.3 book - Part 24 of 88
PDF
The Ring programming language version 1.5.1 book - Part 29 of 180
PDF
The Ring programming language version 1.6 book - Part 33 of 189
The Ring programming language version 1.5.4 book - Part 31 of 185
The Ring programming language version 1.3 book - Part 22 of 88
The Ring programming language version 1.9 book - Part 39 of 210
The Ring programming language version 1.4 book - Part 9 of 30
The Ring programming language version 1.5.4 book - Part 33 of 185
The Ring programming language version 1.3 book - Part 24 of 88
The Ring programming language version 1.5.1 book - Part 29 of 180
The Ring programming language version 1.6 book - Part 33 of 189

What's hot (20)

PDF
The Ring programming language version 1.8 book - Part 36 of 202
PDF
The Ring programming language version 1.2 book - Part 22 of 84
PDF
The Ring programming language version 1.8 book - Part 38 of 202
PDF
The Ring programming language version 1.5.2 book - Part 32 of 181
PDF
The Ring programming language version 1.4.1 book - Part 9 of 31
PDF
The Ring programming language version 1.7 book - Part 34 of 196
PDF
The Ring programming language version 1.9 book - Part 41 of 210
PDF
The Ring programming language version 1.6 book - Part 35 of 189
PDF
The Ring programming language version 1.5 book - Part 6 of 31
PDF
The Ring programming language version 1.5.3 book - Part 33 of 184
PDF
The Ring programming language version 1.5.1 book - Part 30 of 180
PDF
The Ring programming language version 1.5.1 book - Part 31 of 180
PDF
The Ring programming language version 1.7 book - Part 35 of 196
PDF
The Ring programming language version 1.5.2 book - Part 37 of 181
PDF
The Ring programming language version 1.6 book - Part 32 of 189
PPT
Oop objects_classes
PDF
The Ring programming language version 1.5.1 book - Part 36 of 180
PDF
The Ring programming language version 1.6 book - Part 40 of 189
PDF
The Ring programming language version 1.10 book - Part 40 of 212
PDF
The Ring programming language version 1.5.3 book - Part 30 of 184
The Ring programming language version 1.8 book - Part 36 of 202
The Ring programming language version 1.2 book - Part 22 of 84
The Ring programming language version 1.8 book - Part 38 of 202
The Ring programming language version 1.5.2 book - Part 32 of 181
The Ring programming language version 1.4.1 book - Part 9 of 31
The Ring programming language version 1.7 book - Part 34 of 196
The Ring programming language version 1.9 book - Part 41 of 210
The Ring programming language version 1.6 book - Part 35 of 189
The Ring programming language version 1.5 book - Part 6 of 31
The Ring programming language version 1.5.3 book - Part 33 of 184
The Ring programming language version 1.5.1 book - Part 30 of 180
The Ring programming language version 1.5.1 book - Part 31 of 180
The Ring programming language version 1.7 book - Part 35 of 196
The Ring programming language version 1.5.2 book - Part 37 of 181
The Ring programming language version 1.6 book - Part 32 of 189
Oop objects_classes
The Ring programming language version 1.5.1 book - Part 36 of 180
The Ring programming language version 1.6 book - Part 40 of 189
The Ring programming language version 1.10 book - Part 40 of 212
The Ring programming language version 1.5.3 book - Part 30 of 184
Ad

Similar to The Ring programming language version 1.5.3 book - Part 31 of 184 (20)

PDF
The Ring programming language version 1.5.2 book - Part 30 of 181
PDF
The Ring programming language version 1.2 book - Part 20 of 84
PDF
The Ring programming language version 1.10 book - Part 41 of 212
PDF
The Ring programming language version 1.10 book - Part 43 of 212
PDF
The Ring programming language version 1.7 book - Part 37 of 196
PDF
The Ring programming language version 1.5.2 book - Part 71 of 181
PDF
The Ring programming language version 1.3 book - Part 82 of 88
PDF
The Ring programming language version 1.9 book - Part 98 of 210
PDF
The Ring programming language version 1.5.4 book - Part 74 of 185
PDF
The Ring programming language version 1.5.1 book - Part 174 of 180
PDF
The Ring programming language version 1.10 book - Part 100 of 212
PDF
The Ring programming language version 1.7 book - Part 90 of 196
PDF
The Ring programming language version 1.5.3 book - Part 187 of 194
PDF
The Ring programming language version 1.5.2 book - Part 6 of 181
PDF
The Ring programming language version 1.9 book - Part 85 of 210
PDF
The Ring programming language version 1.5.1 book - Part 70 of 180
PDF
The Ring programming language version 1.4.1 book - Part 29 of 31
PDF
The Ring programming language version 1.6 book - Part 76 of 189
PDF
The Ring programming language version 1.10 book - Part 86 of 212
PDF
The Ring programming language version 1.8 book - Part 81 of 202
The Ring programming language version 1.5.2 book - Part 30 of 181
The Ring programming language version 1.2 book - Part 20 of 84
The Ring programming language version 1.10 book - Part 41 of 212
The Ring programming language version 1.10 book - Part 43 of 212
The Ring programming language version 1.7 book - Part 37 of 196
The Ring programming language version 1.5.2 book - Part 71 of 181
The Ring programming language version 1.3 book - Part 82 of 88
The Ring programming language version 1.9 book - Part 98 of 210
The Ring programming language version 1.5.4 book - Part 74 of 185
The Ring programming language version 1.5.1 book - Part 174 of 180
The Ring programming language version 1.10 book - Part 100 of 212
The Ring programming language version 1.7 book - Part 90 of 196
The Ring programming language version 1.5.3 book - Part 187 of 194
The Ring programming language version 1.5.2 book - Part 6 of 181
The Ring programming language version 1.9 book - Part 85 of 210
The Ring programming language version 1.5.1 book - Part 70 of 180
The Ring programming language version 1.4.1 book - Part 29 of 31
The Ring programming language version 1.6 book - Part 76 of 189
The Ring programming language version 1.10 book - Part 86 of 212
The Ring programming language version 1.8 book - Part 81 of 202
Ad

More from Mahmoud Samir Fayed (20)

PDF
The Ring programming language version 1.10 book - Part 212 of 212
PDF
The Ring programming language version 1.10 book - Part 211 of 212
PDF
The Ring programming language version 1.10 book - Part 210 of 212
PDF
The Ring programming language version 1.10 book - Part 208 of 212
PDF
The Ring programming language version 1.10 book - Part 207 of 212
PDF
The Ring programming language version 1.10 book - Part 205 of 212
PDF
The Ring programming language version 1.10 book - Part 206 of 212
PDF
The Ring programming language version 1.10 book - Part 204 of 212
PDF
The Ring programming language version 1.10 book - Part 203 of 212
PDF
The Ring programming language version 1.10 book - Part 202 of 212
PDF
The Ring programming language version 1.10 book - Part 201 of 212
PDF
The Ring programming language version 1.10 book - Part 200 of 212
PDF
The Ring programming language version 1.10 book - Part 199 of 212
PDF
The Ring programming language version 1.10 book - Part 198 of 212
PDF
The Ring programming language version 1.10 book - Part 197 of 212
PDF
The Ring programming language version 1.10 book - Part 196 of 212
PDF
The Ring programming language version 1.10 book - Part 195 of 212
PDF
The Ring programming language version 1.10 book - Part 194 of 212
PDF
The Ring programming language version 1.10 book - Part 193 of 212
PDF
The Ring programming language version 1.10 book - Part 192 of 212
The Ring programming language version 1.10 book - Part 212 of 212
The Ring programming language version 1.10 book - Part 211 of 212
The Ring programming language version 1.10 book - Part 210 of 212
The Ring programming language version 1.10 book - Part 208 of 212
The Ring programming language version 1.10 book - Part 207 of 212
The Ring programming language version 1.10 book - Part 205 of 212
The Ring programming language version 1.10 book - Part 206 of 212
The Ring programming language version 1.10 book - Part 204 of 212
The Ring programming language version 1.10 book - Part 203 of 212
The Ring programming language version 1.10 book - Part 202 of 212
The Ring programming language version 1.10 book - Part 201 of 212
The Ring programming language version 1.10 book - Part 200 of 212
The Ring programming language version 1.10 book - Part 199 of 212
The Ring programming language version 1.10 book - Part 198 of 212
The Ring programming language version 1.10 book - Part 197 of 212
The Ring programming language version 1.10 book - Part 196 of 212
The Ring programming language version 1.10 book - Part 195 of 212
The Ring programming language version 1.10 book - Part 194 of 212
The Ring programming language version 1.10 book - Part 193 of 212
The Ring programming language version 1.10 book - Part 192 of 212

Recently uploaded (20)

PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
cuic standard and advanced reporting.pdf
PPTX
Big Data Technologies - Introduction.pptx
PDF
Electronic commerce courselecture one. Pdf
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PPTX
Cloud computing and distributed systems.
PPTX
MYSQL Presentation for SQL database connectivity
PPT
Teaching material agriculture food technology
PPTX
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
PDF
MIND Revenue Release Quarter 2 2025 Press Release
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
Empathic Computing: Creating Shared Understanding
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
Encapsulation theory and applications.pdf
PDF
KodekX | Application Modernization Development
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Review of recent advances in non-invasive hemoglobin estimation
20250228 LYD VKU AI Blended-Learning.pptx
Agricultural_Statistics_at_a_Glance_2022_0.pdf
cuic standard and advanced reporting.pdf
Big Data Technologies - Introduction.pptx
Electronic commerce courselecture one. Pdf
Unlocking AI with Model Context Protocol (MCP)
Advanced methodologies resolving dimensionality complications for autism neur...
Per capita expenditure prediction using model stacking based on satellite ima...
Cloud computing and distributed systems.
MYSQL Presentation for SQL database connectivity
Teaching material agriculture food technology
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
MIND Revenue Release Quarter 2 2025 Press Release
Building Integrated photovoltaic BIPV_UPV.pdf
Empathic Computing: Creating Shared Understanding
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Encapsulation theory and applications.pdf
KodekX | Application Modernization Development
Spectral efficient network and resource selection model in 5G networks
Review of recent advances in non-invasive hemoglobin estimation

The Ring programming language version 1.5.3 book - Part 31 of 184

  • 1. Ring Documentation, Release 1.5.3 Func main e1 = new Employee { Name = "test" age = 20 job = "programmer" salary = 20000000 print() } Class Human Name Age func print see "Name : " + name + nl + "Age : " + age + nl Class Employee from Human Job Salary func print super.print() see "Job : " + job + nl + "Salary : " + salary + nl Output: Name : test Age : 20 Job : programmer Salary : 20000000 39.8 Dynamic Attributes We can write instructions after the class name to be executed when we create new objects Example: o1 = new dynamicClass see o1.var5 + nl # output 5 Class DynamicClass for x = 1 to 10 cStr = "var" + x + " = " + x eval(cStr) next Tip: in the previous example var1, var2, ..., var10 will be defined as attributes. Tip: The problem with the previous example is that x and cStr will be defined as attributes too! Note: we can write class definitions inside a string then using eval() we can execute the string to define the classes 39.9 Packages We can create a package (a group of classes under a common name) using the next syntax 39.8. Dynamic Attributes 275
  • 2. Ring Documentation, Release 1.5.3 package PackageName Class Class1 ... Class Class2 ... Class Class3 ... ... Example o1 = new System.output.console o1.print("Hello World") Package System.Output Class Console Func Print cText see cText + nl Note: we can use the dot operator as part of the package name Instead of typing the long name PackageName.ClassName we can use the import command When we import a package, we can use any class inside this package directly. Example import system.output o1 = new console { print("Hello World") } Package System.Output Class Console Func Print cText see cText + nl 39.10 Printing Objects We can print the object state (attributes and values) using the see command. Example: see new point { x=10 y=20 z=30 } class point x y z Output: x: 10.000000 y: 20.000000 z: 30.000000 39.11 Find() and List of Objects We can use the find() function to search inside a list of objects. Syntax: 39.10. Printing Objects 276
  • 3. Ring Documentation, Release 1.5.3 Find(List,ItemValue,nColumn,cAttribute) ---> Item Index Example: myList1 = [new Company {position=3 name="Mahmoud" symbol="MHD"}, new Company {position=2 name="Bert" symbol="BRT"}, new Company {position=1 name="Ring" symbol="RNG"} ] see find(mylist1,"Bert",1,"name") + nl see find(mylist1,"Ring",1,"name") + nl see find(mylist1,"Mahmoud",1,"name") + nl see find(mylist1,"RNG",1,"symbol") + nl see find(mylist1,"MHD",1,"symbol") + nl see find(mylist1,"BRT",1,"symbol") + nl see find(mylist1,3,1,"position") + nl see find(mylist1,1,1,"position") + nl see "Other" + nl see find(mylist1,"test",1,"name") + nl see find(mylist1,"test",0,"name") + nl see find(mylist1,"test",5,"name") + nl class company position name symbol Output: 2 3 1 3 1 2 1 3 Other 0 0 0 39.12 Sort() and list of objects We can sort a list of objects based on an object attribute using the Sort() function. Syntax: Sort(List,nColumn,cAttribute) ---> Sorted List based on Object Attribute Example: myList1 = [ new Company {position=3 name="Mahmoud" symbol="MHD"}, new Company {position=2 name="Bert" symbol="BRT"}, new Company {position=8 name="Charlie" symbol="CHR"}, new Company {position=6 name="Easy" symbol="FEAS"}, new Company {position=7 name="Fox" symbol="EFOX"}, new Company {position=5 name="Dog" symbol="GDOG"}, new Company {position=4 name="George" symbol="DGRG"}, 39.12. Sort() and list of objects 277
  • 4. Ring Documentation, Release 1.5.3 new Company {position=1 name="Ring" symbol="RNG"} ] see sort(mylist1,1,"name") see copy("*",70) + nl see sort(mylist1,1,"symbol") see copy("*",70) + nl see sort(mylist1,1,"position") class company position name symbol Output: position: 2.000000 name: Bert symbol: BRT position: 8.000000 name: Charlie symbol: CHR position: 5.000000 name: Dog symbol: GDOG position: 6.000000 name: Easy symbol: FEAS position: 7.000000 name: Fox symbol: EFOX position: 4.000000 name: George symbol: DGRG position: 3.000000 name: Mahmoud symbol: MHD position: 1.000000 name: Ring symbol: RNG ********************************************************************** position: 2.000000 name: Bert symbol: BRT position: 8.000000 name: Charlie symbol: CHR position: 4.000000 name: George symbol: DGRG position: 7.000000 name: Fox symbol: EFOX position: 6.000000 name: Easy symbol: FEAS position: 5.000000 name: Dog symbol: GDOG position: 3.000000 name: Mahmoud 39.12. Sort() and list of objects 278
  • 5. Ring Documentation, Release 1.5.3 symbol: MHD position: 1.000000 name: Ring symbol: RNG ********************************************************************** position: 1.000000 name: Ring symbol: RNG position: 2.000000 name: Bert symbol: BRT position: 3.000000 name: Mahmoud symbol: MHD position: 4.000000 name: George symbol: DGRG position: 5.000000 name: Dog symbol: GDOG position: 6.000000 name: Easy symbol: FEAS position: 7.000000 name: Fox symbol: EFOX position: 8.000000 name: Charlie symbol: CHR 39.13 Using Self.Attribute and Self.Method() Inside the class region (After the class name and before any method) and the class methods we can use self.attribute and self.method() Class Point self.x = 10 self.y = 20 self.z = 30 func print see self.x + nl + self.y + nl + self.z + nl Note: using self.attribute in the class region to define the class attribute protect the class attributes from conflict with global variables. Tip: if you typed the class attributes with self.attribute and there are a global variable with the same name it will be used and the attribute will not be defined. Check the “Scope Rules” chapter to know about the conflict between the global variable name and the attribute name Whay this may happens? Because • Because in the class region we can access global variables. 39.13. Using Self.Attribute and Self.Method() 279
  • 6. Ring Documentation, Release 1.5.3 • Before defining any variable, Ring try to find the variable and use it if it’s found. Note: Try to avoid the global variables, use the main function and start their names with $ Tip: In large programs protect your classes and define their members using self.attribute 39.14 Using This.Attribute and This.Method() Inside class methods we have access to the object scope directly. we don’t need to use Self.attribute or Self.method to read/write attribute and call methods. But we can use braces {} while we are inside methods to access another object, In this case the current object scope will be changed while we are inside the brace. How we can get access to our class attributes and methods while we are inside braces? This can be done using This.Attribute and This.Method() Example: new point class point x=10 y=20 z=30 print() func print new UI { display(this.x,this.y,this.z) } Class UI func display x,y,z see x + nl + y + nl + z + nl 39.14. Using This.Attribute and This.Method() 280
  • 7. CHAPTER FORTY FUNCTIONAL PROGRAMMING In previous chapters we learned about Functions and Recursion. In this chapter we are going to learn about more Functional Programming (FP) concepts like • Pure Functions • First-class functions • Higher-order functions • Anonymous and nested functions. • Equality of functions 40.1 Pure Functions We can create pure functions (functions that doesn’t change the state) by the help of the assignment operator to copy variables (Lists & Objects) by value to create new variables instead of working on the original data that are passed to the function by reference. Example: Func Main aList = [1,2,3,4,5] aList2 = square(aList) see "aList" + nl see aList see "aList2" + nl see aList2 Func Square aPara a1 = aPara # copy the list for x in a1 x *= x next return a1 # return new list Output: aList 1 2 3 4 5 281
  • 8. Ring Documentation, Release 1.5.3 aList2 1 4 9 16 25 40.2 First-class Functions Functions inside the Ring programming language are first-class citizens, you can pass functions as parameters, return them as value or store them in variables. We can pass/return the function by typing the function name as literal like “FunctionName” or :FunctionName for example. We can pass/return functions using the variable that contains the function name. We can call function from variables contains the function name using the Call command Syntax: Call Variable([Parameters]) Example: Func Main see "before test2()" + nl f = Test2(:Test) see "after test2()" + nl call f() Func Test see "Message from test!" + nl Func Test2 f1 call f1() See "Message from test2!" + nl return f1 Output: before test2() Message from test! Message from test2! after test2() Message from test! 40.3 Higher-order Functions Higher-order functions are the functions that takes other functions as parameters. Example: Func Main times(5,:test) 40.2. First-class Functions 282
  • 9. Ring Documentation, Release 1.5.3 Func Test see "Message from the test function!" + nl Func Times nCount,F for x = 1 to nCount Call F() next Output: Message from the test function! Message from the test function! Message from the test function! Message from the test function! Message from the test function! 40.4 Anonymous and Nested Functions Anonymous Functions are functions without names that can be passed as parameters to other functions or stored in variables. Syntax: Func [Parameters] { [statements] } Example: test( func x,y { see "hello" + nl see "Sum : " + (x+y) + nl } ) new great { f1() } times(3, func { see "hello world" + nl } ) func test x call x(3,3) see "wow!" + nl func times n,x for t=1 to n call x() next Class great func f1 f2( func { see "Message from f1" + nl } ) func f2 x call x() Output: hello Sum : 6 40.4. Anonymous and Nested Functions 283
  • 10. Ring Documentation, Release 1.5.3 wow! Message from f1 hello world hello world hello world Example: Func Main aList = [1,2,3,4] Map (aList , func x { return x*x } ) see aList aList = [4,9,14,25] Map(aList, :myfilter ) see aList aList = [11,12,13,14] Map (aList , func x { if x%2=0 return "even" else return "odd" ok }) see aList Func myfilter x if x = 9 return "True" else return "False" ok Func Map aList,cFunc for x in aList x = call cFunc(x) next Output: 1 4 9 16 False True False False odd even odd even 40.5 Equality of functions We can test if function = function or not using the ‘=’ or ‘!=’ operators 40.5. Equality of functions 284