Ring Documentation, Release 1.7
4. Object
The first type (Number) is used to represent int, double and Boolean values.
The second type (String) is used to represent char, array of characters, date and time.
The third type (List) is used to represent Arrays of one type, Arrays of more than one type, Hash (Dictionary), Tree,
etc.
The object can be an object created from a Ring class (Any Class) or just a C Pointer that we get from calling a C/C++
function/method.
Why ?
The Ring is designed to give the programmer/developer the most simple constructs that can be used to do everything.
The programmer/developer can customize the language by creating new classes (and use operator overloading) to get
more types that he care about according to the problem domain.
Why ?
Because simple is better, and easy to learn and remember! And this provide flexibility to convert between high level
types that can be represented using the same basic type
76.17 What is the goal of including the “Main” function in Ring?
The main function is very important, you need it when you want to write statements that uses local variables instead
of the Global scope.
Example:
x = 10
myfunc()
See "X value = " + X # here I expect that x will be (10)
# but I will get another value (6) because myfunc() uses x !
Func myfunc
for x = 1 to 5
See x + nl
next
Output:
1
2
3
4
5
X value = 6
Now using the Main function
Func Main
x = 10
myfunc()
See "X value = " + X
Func myfunc
for x = 1 to 5
See x + nl
next
76.17. What is the goal of including the “Main” function in Ring? 862
Ring Documentation, Release 1.7
Output
1
2
3
4
5
X value = 10
76.18 Why the list index start from 1 in Ring?
It’s about how we count in the real world, when we have three apples in our hand
we say 1 2 3
We don’t start from 0
The question must be why the other languages start from 0 ?
The answer is, because this is related to the machine and how we deal with values and memory address.
Example
we have array called myarray[5]
In memory : myarray will have an address
The first item will be stored in that address
The second item will come after that address and so on
Now when we need to point to the first item we need the address of myarray
So we type myarray[0] because myarray + 0 result will still point to the first item
for the second item myarray[1] because myarray + 1 result will point to the second item and so on
In Low Level languages or languages near to the machine it’s good to be like this
But for high level language designed for applications it’s better to be natural
Example
mylist = [1,2,3,4,5]
for x = 1 to len(mylist)
see x + nl
next
In the previous example we start from 1 to the length of the array if the index starts from 0 we will write
for x = 0 to len(mylist)-1
or remember the for loop in other languages
for(x=0 ; x<nMax ; x++ )
You will use the < operator !
76.19 Why Ring is not case-sensitive?
1. To be more human-friendly
76.18. Why the list index start from 1 in Ring? 863
Ring Documentation, Release 1.7
2. Like Ada, SQL, Pascal, Delphi, Visual Basic, Visual FoxPro, etc.
3. To help in supporting Natural Language Programming.
4. To be able to select your favorite style when writing the language keywords
see "lower case!"
SEE "UPPER case!"
See "First Letter is UPPER case!"
5. To avoid getting error message when writing quick tests then type “variable” instead of “Variable”.
6. To avoid getting error message when you type “Dosomething()” instead of “doSomething()”
7. In Ring, No conflict between Variables, Method Names & Classes Names
We can write person as variable name and Person as class name.
person = new Person
class Person
name address phone
76.20 Why the Assignment operator uses Deep Copy?
“Because it’s a poor tradeoff to add complexity for dubious performance gains, a good approach to deep vs. shallow
copies is to prefer deep copies until proven otherwise.”
, Steve McConnell, Code Complete
1. It’s more natural, When you use the assignment operator, You expect a deep copy.
2. If you don’t need a deep copy, Just don’t use it!
3. The Ring language is designed to reduce references usage as much as possible.
4. The Ring language is designed to make using references simple and possible in special cases where this make
sense.
5. We have references when this is natural, like passing lists and objects to functions, creating objects (Like
GUI Objects) from a C/C++ library, returning an object stored inside a list.
6. It is a feature, We can use it to create pure functions. The Value() function in the stdlib uses this feature to
pass lists & objects by value when we need this.
7. When we need references, It’s recommended to create a class that manage sharing lists and objects.
8. It’s more safe at the application level to avoid many logical errors.
9. In Ring, we start without thinking about the little details and concentrate on the application, You don’t
have to write the type (Dynamic Typing), You don’t have to write explicit conversions between numbers
and strings (Weakly Typed) and you don’t have to select between using values or references, You don’t
have to write the scope (Lexical Scoping).
10. In Ring, we have smart garbage collector (Simple & Fast), We can delete the memory directly at any
time using the Assignment operator too. Reducing references usage or using them through managers
helps a lot to achieve this goal. by doing this we have full control.
11. If you want to create references and avoid creating a manager, You can use Object2Pointer() and Pointer2Object() functio
But It’s not the Ring way “Spirit” to do things.
76.20. Why the Assignment operator uses Deep Copy? 864
Ring Documentation, Release 1.7
76.21 Is there constructor methods in Ring?
When you create new object for example
new point
1 - Ring will allocate dynamic memory space to be used for the new object attributes that Ring doesn’t know anything
about them.
2 - Ring will change the current local scope and the current object scope to use the object state created in step (1)
3 - Ring will move the execution to the class Region (After the class name and before any methods)
4 - Any Instructions/Code in the class region will be executed as any Ring code
5 - Control is moved from the class region to the location of (new point) once we reach the end of the class region or
we uses a Return command.
So All attributes that added to the object are dynamic attributes, this mean that you can control what attributes will be
added through the runtime.
Example:
$3D = False
see new point
$3D = True
see new point
class point
x y
if not $3D return ok
z
Output:
x: NULL
y: NULL
x: NULL
y: NULL
z: NULL
You have an option to call init() method directly when you create a new object
This method can do anything with the object attributes as it will be called after creating the object and executing the
class region code.
p1 = new point3d(100,200,300)
see p1
class point3d
x y z
func init p1,p2,p3
x=p1 y=p2 z=p3
76.22 What happens when we create a new object?
1- When you create an object, the class region code will be executed and you will have the object attributes based on
the code in that region
76.21. Is there constructor methods in Ring? 865
Ring Documentation, Release 1.7
2- Ring don’t care about the object methods until you start calling a method
3- When you call a method, Ring will check the object class and the class parent (if you are using inheritance) and
will collect the methods for you to be used now or later from any object that belong to the same class.
4- Since methods are dynamic and each object get the method from the class, you can after creating objects, add new
methods and use it with the object or any object created or will be created from the same class.
Example:
o1 = new point {x=10 y=20 z=30}
o2 = new point {x=100 y=200 z =300}
addmethod(o1,"print", func { see x + nl + y + nl + z + nl } )
o1.print()
o2.print()
class point x y z
Output:
10
20
30
100
200
300
76.23 Can we use the attributes by accessing the Getter and Setter
methods?
Yes we can, The setter/getter methods are called automatically when you start using the attributes from outside the
class Also you can call the methods instead of using the attributes. It’s your choice.
Example:
o1 = new Developer
o1.name = "Mahmoud" see o1.name + nl
o1 { name = "Gal" see name }
o1 { name = "Bert" see name }
o1.setname("Marino")
see o1.getname()
Class Developer
name language = "Ring Programming Language"
func setname value
see "Message from SetName() Function!" + nl
name = value + " - " + language
func getname
see "Message from GetName() Function!" + nl + nl
return "Mr. " + name + nl
Output
76.23. Can we use the attributes by accessing the Getter and Setter methods? 866
Ring Documentation, Release 1.7
Message from SetName() Function!
Message from GetName() Function!
Mr. Mahmoud - Ring Programming Language
Message from SetName() Function!
Message from GetName() Function!
Mr. Gal - Ring Programming Language
Message from SetName() Function!
Message from GetName() Function!
Mr. Bert - Ring Programming Language
Message from SetName() Function!
Message from GetName() Function!
Mr. Marino - Ring Programming Language
76.24 Why should a search of global names be made while defining
the class attributes?
The question is why we don’t avoid conflicts with global variable names when we define the class attributes ?
At first remember that using the optional $ mark in the global variables names solve the problem. Also using the Main
function and avoiding global variables may help.
The Answer:
Ring is a dynamic language
We can in the run-time determine the class attributes (Add/Remove)
We can execute (any code) while defining the class attributes
Example (1)
oPerson = new Person
Class Person
See "Welcome to the Ring language"
Example (2)
Customize attributes based on global variable value
$debug = true
oPerson = new Person
see oPerson
Class Person
if $debug date=date() time=time() ok
In the previous example when we have the $debug flag set to true, we will add the Date and Time attributes to the
object state.
Example (3)
Store the object index based on global variable
76.24. Why should a search of global names be made while defining the class attributes? 867
Ring Documentation, Release 1.7
$ObjectsCount = 0
oPerson = new Person
see oPerson
oPerson2 = new Person
see oPerson2
Class Person
$ObjectsCount++
nIndex = $ObjectsCount
Output:
nindex: 1.000000
nindex: 2.000000
Common Example:
• Connect to the database then get table columns (Using global Variable/Object).
• Create class attributes based on the column names.
• Later when you modify the database - you may don’t need to modify your code.
It’s flexibility but remember that power comes with great responsibility.
76.25 Why Ring doesn’t avoid the conflict between Global Variables
and Class Attributes Names?
In this use case we have
1 - Global Variable defined without a special mark like $
2 - Class contains Attributes defined using a special syntax (where we type the attribute name directly after the class)
3 - The Attributes are defined in the class region that allows writing code and using global variables
If I will accepted your proposal about changing how Ring find variables in the class region I must break one of the
previous three features which will lead to more problems that are more important than this problem.
I don’t like changing the feature number (1) because I would like to keep Ring code more clean and let the programmer
decide when to use $ or not.
I don’t like changing the feature number (2) because I like this feature and I don’t like forcing the programmer to type
self.attribute
I don’t like changing the feature number (3) because it’s very important in many applications to access global variables
in the class region.
So what was my decision ?
I decided to leave this case for the programmer who will decide what to do to avoid this special case
1 - The programmer can avoid using global variables (Better) and can use the Main function (Optional)
2 - The programmer can use $ before the variable name or any mark like global_ or g_
3 - The programmer can use self.attribute after the class name to define the attributes
In general, for small programs you can use global variables and functions. For large programs, use classes and objects
and small number of global variables or avoid them at all.
76.25. Why Ring doesn’t avoid the conflict between Global Variables and Class Attributes Names?868
Ring Documentation, Release 1.7
76.26 Where can I write a program and execute it?
Run the Ring Notepad where you can write/execute programs.
If you want to run programs using the command line
Add Ring/bin folder to the path then
76.27 How to get the file size using ftell() and fseek() functions?
The next function can be used to get the file size without reading the file!
func getFileSize fp
C_FILESTART = 0
C_FILEEND = 2
fseek(fp,0,C_FILEEND)
nFileSize = ftell(fp)
fseek(fp,0,C_FILESTART)
return nFileSize
Note: The previous function take the fp (file pointer) as parameter, We can get the fp from opening the file using
fopen() function.
fp = fopen("filename","r")
see "File Size : " + getFileSize(fp) + nl
Another solution (Read the file)
see len(read("filename"))
76.28 How to get the current source file path?
We can use the next function to get the current source file path then we can add the path variable to the file name
cPath = CurrentPath()
func currentpath
cFileName = filename()
for x = len(cFileName) to 1 step -1
if cFileName[x] = "/"
return left(cFileName,x-1)
ok
next
return cFileName
76.29 What about predefined parameters or optional parameters in
functions?
if you want to use predefined parameters or optional parameters Just accept a list that works like hash/dictionary
Example
76.26. Where can I write a program and execute it? 869
Ring Documentation, Release 1.7
sum([ :a = 1, :b = 2])
sum([ :a = 1 ])
sum([ :b = 2 ])
func sum pList
if plist[:a] = NULL pList[:a] = 4 ok
if plist[:b] = NULL pList[:b] = 5 ok
see pList[:a] + pList[:b] + nl
Output
3
6
6
76.30 How to print keys or values only in List/Dictionary?
If you want to print keys only or values only just select the index of the item (one or two).
Example
C_COUNTRY = 1
C_CITY = 2
mylist = [
:KSA = "Riyadh" ,
:Egypt = "Cairo"
]
for x in mylist
see x[C_COUNTRY] + nl
next
for x in mylist
see x[C_CITY] + nl
next
Output
ksa
egypt
Riyadh
Cairo
76.31 Why I get a strange result when printing nl with lists?
In the next code
list = 1:5 # list = [1,2,3,4,5]
see list + nl
New Line will be added to the list then the list will be printed, the default print of the lists will print a newline at the
end, You added new newline and You have now 2 newlines to be printed.
See <Expr>
The see command just print the final result of the expression, the expression will be evaluated as it
76.30. How to print keys or values only in List/Dictionary? 870
Ring Documentation, Release 1.7
nl = char(13) + char(10) # just a variable that you can change to anything !
The + is an operator
string + string ---> new string
string + number ---> new string
number + number ---> new number
number + string ---> new number
list + item —> nothing new will be created but the item will be added to the same list
Exception
number + nl -> New String
This exception is added to easily print numbers then new line.
No need for this with printing lists because after printing the last item we already get a new line.
76.32 Could you explain the output of the StrCmp() function?
At first remember that you can check strings using ‘=’ operator directly.
see strcmp("hello","hello") + nl +
strcmp("abc","bcd") + nl +
strcmp("bcd","abc") + nl
if the two strings are the same then it returns 0
abc and bcd aren’t the same. in the second line it returns -1 and in the third line it returns 1
In the second line we compare between “abc” and “bcd”
Not equal because the first letter in “abc” = “a” and the first letter in “bcd” = “b”
So we have “a” != “b” and “a” < “b”
So we get output = -1
In the third line we have “bcd” and “abc”
the first letter in “bcd” is “b” and the first letter in “abc” is “a”
So we have “b” != “a” and “b” > “a”
So we get output = 1
Note: ASCII(“a”) = 97 and ASCII(“b”) = 98 So “a” < “b” because 97 < 98
76.33 How to use many source code files in the project?
Example:
I have the next folder
C:LRing
Contains the next files
76.32. Could you explain the output of the StrCmp() function? 871

The Ring programming language version 1.7 book - Part 90 of 196

  • 1.
    Ring Documentation, Release1.7 4. Object The first type (Number) is used to represent int, double and Boolean values. The second type (String) is used to represent char, array of characters, date and time. The third type (List) is used to represent Arrays of one type, Arrays of more than one type, Hash (Dictionary), Tree, etc. The object can be an object created from a Ring class (Any Class) or just a C Pointer that we get from calling a C/C++ function/method. Why ? The Ring is designed to give the programmer/developer the most simple constructs that can be used to do everything. The programmer/developer can customize the language by creating new classes (and use operator overloading) to get more types that he care about according to the problem domain. Why ? Because simple is better, and easy to learn and remember! And this provide flexibility to convert between high level types that can be represented using the same basic type 76.17 What is the goal of including the “Main” function in Ring? The main function is very important, you need it when you want to write statements that uses local variables instead of the Global scope. Example: x = 10 myfunc() See "X value = " + X # here I expect that x will be (10) # but I will get another value (6) because myfunc() uses x ! Func myfunc for x = 1 to 5 See x + nl next Output: 1 2 3 4 5 X value = 6 Now using the Main function Func Main x = 10 myfunc() See "X value = " + X Func myfunc for x = 1 to 5 See x + nl next 76.17. What is the goal of including the “Main” function in Ring? 862
  • 2.
    Ring Documentation, Release1.7 Output 1 2 3 4 5 X value = 10 76.18 Why the list index start from 1 in Ring? It’s about how we count in the real world, when we have three apples in our hand we say 1 2 3 We don’t start from 0 The question must be why the other languages start from 0 ? The answer is, because this is related to the machine and how we deal with values and memory address. Example we have array called myarray[5] In memory : myarray will have an address The first item will be stored in that address The second item will come after that address and so on Now when we need to point to the first item we need the address of myarray So we type myarray[0] because myarray + 0 result will still point to the first item for the second item myarray[1] because myarray + 1 result will point to the second item and so on In Low Level languages or languages near to the machine it’s good to be like this But for high level language designed for applications it’s better to be natural Example mylist = [1,2,3,4,5] for x = 1 to len(mylist) see x + nl next In the previous example we start from 1 to the length of the array if the index starts from 0 we will write for x = 0 to len(mylist)-1 or remember the for loop in other languages for(x=0 ; x<nMax ; x++ ) You will use the < operator ! 76.19 Why Ring is not case-sensitive? 1. To be more human-friendly 76.18. Why the list index start from 1 in Ring? 863
  • 3.
    Ring Documentation, Release1.7 2. Like Ada, SQL, Pascal, Delphi, Visual Basic, Visual FoxPro, etc. 3. To help in supporting Natural Language Programming. 4. To be able to select your favorite style when writing the language keywords see "lower case!" SEE "UPPER case!" See "First Letter is UPPER case!" 5. To avoid getting error message when writing quick tests then type “variable” instead of “Variable”. 6. To avoid getting error message when you type “Dosomething()” instead of “doSomething()” 7. In Ring, No conflict between Variables, Method Names & Classes Names We can write person as variable name and Person as class name. person = new Person class Person name address phone 76.20 Why the Assignment operator uses Deep Copy? “Because it’s a poor tradeoff to add complexity for dubious performance gains, a good approach to deep vs. shallow copies is to prefer deep copies until proven otherwise.” , Steve McConnell, Code Complete 1. It’s more natural, When you use the assignment operator, You expect a deep copy. 2. If you don’t need a deep copy, Just don’t use it! 3. The Ring language is designed to reduce references usage as much as possible. 4. The Ring language is designed to make using references simple and possible in special cases where this make sense. 5. We have references when this is natural, like passing lists and objects to functions, creating objects (Like GUI Objects) from a C/C++ library, returning an object stored inside a list. 6. It is a feature, We can use it to create pure functions. The Value() function in the stdlib uses this feature to pass lists & objects by value when we need this. 7. When we need references, It’s recommended to create a class that manage sharing lists and objects. 8. It’s more safe at the application level to avoid many logical errors. 9. In Ring, we start without thinking about the little details and concentrate on the application, You don’t have to write the type (Dynamic Typing), You don’t have to write explicit conversions between numbers and strings (Weakly Typed) and you don’t have to select between using values or references, You don’t have to write the scope (Lexical Scoping). 10. In Ring, we have smart garbage collector (Simple & Fast), We can delete the memory directly at any time using the Assignment operator too. Reducing references usage or using them through managers helps a lot to achieve this goal. by doing this we have full control. 11. If you want to create references and avoid creating a manager, You can use Object2Pointer() and Pointer2Object() functio But It’s not the Ring way “Spirit” to do things. 76.20. Why the Assignment operator uses Deep Copy? 864
  • 4.
    Ring Documentation, Release1.7 76.21 Is there constructor methods in Ring? When you create new object for example new point 1 - Ring will allocate dynamic memory space to be used for the new object attributes that Ring doesn’t know anything about them. 2 - Ring will change the current local scope and the current object scope to use the object state created in step (1) 3 - Ring will move the execution to the class Region (After the class name and before any methods) 4 - Any Instructions/Code in the class region will be executed as any Ring code 5 - Control is moved from the class region to the location of (new point) once we reach the end of the class region or we uses a Return command. So All attributes that added to the object are dynamic attributes, this mean that you can control what attributes will be added through the runtime. Example: $3D = False see new point $3D = True see new point class point x y if not $3D return ok z Output: x: NULL y: NULL x: NULL y: NULL z: NULL You have an option to call init() method directly when you create a new object This method can do anything with the object attributes as it will be called after creating the object and executing the class region code. p1 = new point3d(100,200,300) see p1 class point3d x y z func init p1,p2,p3 x=p1 y=p2 z=p3 76.22 What happens when we create a new object? 1- When you create an object, the class region code will be executed and you will have the object attributes based on the code in that region 76.21. Is there constructor methods in Ring? 865
  • 5.
    Ring Documentation, Release1.7 2- Ring don’t care about the object methods until you start calling a method 3- When you call a method, Ring will check the object class and the class parent (if you are using inheritance) and will collect the methods for you to be used now or later from any object that belong to the same class. 4- Since methods are dynamic and each object get the method from the class, you can after creating objects, add new methods and use it with the object or any object created or will be created from the same class. Example: o1 = new point {x=10 y=20 z=30} o2 = new point {x=100 y=200 z =300} addmethod(o1,"print", func { see x + nl + y + nl + z + nl } ) o1.print() o2.print() class point x y z Output: 10 20 30 100 200 300 76.23 Can we use the attributes by accessing the Getter and Setter methods? Yes we can, The setter/getter methods are called automatically when you start using the attributes from outside the class Also you can call the methods instead of using the attributes. It’s your choice. Example: o1 = new Developer o1.name = "Mahmoud" see o1.name + nl o1 { name = "Gal" see name } o1 { name = "Bert" see name } o1.setname("Marino") see o1.getname() Class Developer name language = "Ring Programming Language" func setname value see "Message from SetName() Function!" + nl name = value + " - " + language func getname see "Message from GetName() Function!" + nl + nl return "Mr. " + name + nl Output 76.23. Can we use the attributes by accessing the Getter and Setter methods? 866
  • 6.
    Ring Documentation, Release1.7 Message from SetName() Function! Message from GetName() Function! Mr. Mahmoud - Ring Programming Language Message from SetName() Function! Message from GetName() Function! Mr. Gal - Ring Programming Language Message from SetName() Function! Message from GetName() Function! Mr. Bert - Ring Programming Language Message from SetName() Function! Message from GetName() Function! Mr. Marino - Ring Programming Language 76.24 Why should a search of global names be made while defining the class attributes? The question is why we don’t avoid conflicts with global variable names when we define the class attributes ? At first remember that using the optional $ mark in the global variables names solve the problem. Also using the Main function and avoiding global variables may help. The Answer: Ring is a dynamic language We can in the run-time determine the class attributes (Add/Remove) We can execute (any code) while defining the class attributes Example (1) oPerson = new Person Class Person See "Welcome to the Ring language" Example (2) Customize attributes based on global variable value $debug = true oPerson = new Person see oPerson Class Person if $debug date=date() time=time() ok In the previous example when we have the $debug flag set to true, we will add the Date and Time attributes to the object state. Example (3) Store the object index based on global variable 76.24. Why should a search of global names be made while defining the class attributes? 867
  • 7.
    Ring Documentation, Release1.7 $ObjectsCount = 0 oPerson = new Person see oPerson oPerson2 = new Person see oPerson2 Class Person $ObjectsCount++ nIndex = $ObjectsCount Output: nindex: 1.000000 nindex: 2.000000 Common Example: • Connect to the database then get table columns (Using global Variable/Object). • Create class attributes based on the column names. • Later when you modify the database - you may don’t need to modify your code. It’s flexibility but remember that power comes with great responsibility. 76.25 Why Ring doesn’t avoid the conflict between Global Variables and Class Attributes Names? In this use case we have 1 - Global Variable defined without a special mark like $ 2 - Class contains Attributes defined using a special syntax (where we type the attribute name directly after the class) 3 - The Attributes are defined in the class region that allows writing code and using global variables If I will accepted your proposal about changing how Ring find variables in the class region I must break one of the previous three features which will lead to more problems that are more important than this problem. I don’t like changing the feature number (1) because I would like to keep Ring code more clean and let the programmer decide when to use $ or not. I don’t like changing the feature number (2) because I like this feature and I don’t like forcing the programmer to type self.attribute I don’t like changing the feature number (3) because it’s very important in many applications to access global variables in the class region. So what was my decision ? I decided to leave this case for the programmer who will decide what to do to avoid this special case 1 - The programmer can avoid using global variables (Better) and can use the Main function (Optional) 2 - The programmer can use $ before the variable name or any mark like global_ or g_ 3 - The programmer can use self.attribute after the class name to define the attributes In general, for small programs you can use global variables and functions. For large programs, use classes and objects and small number of global variables or avoid them at all. 76.25. Why Ring doesn’t avoid the conflict between Global Variables and Class Attributes Names?868
  • 8.
    Ring Documentation, Release1.7 76.26 Where can I write a program and execute it? Run the Ring Notepad where you can write/execute programs. If you want to run programs using the command line Add Ring/bin folder to the path then 76.27 How to get the file size using ftell() and fseek() functions? The next function can be used to get the file size without reading the file! func getFileSize fp C_FILESTART = 0 C_FILEEND = 2 fseek(fp,0,C_FILEEND) nFileSize = ftell(fp) fseek(fp,0,C_FILESTART) return nFileSize Note: The previous function take the fp (file pointer) as parameter, We can get the fp from opening the file using fopen() function. fp = fopen("filename","r") see "File Size : " + getFileSize(fp) + nl Another solution (Read the file) see len(read("filename")) 76.28 How to get the current source file path? We can use the next function to get the current source file path then we can add the path variable to the file name cPath = CurrentPath() func currentpath cFileName = filename() for x = len(cFileName) to 1 step -1 if cFileName[x] = "/" return left(cFileName,x-1) ok next return cFileName 76.29 What about predefined parameters or optional parameters in functions? if you want to use predefined parameters or optional parameters Just accept a list that works like hash/dictionary Example 76.26. Where can I write a program and execute it? 869
  • 9.
    Ring Documentation, Release1.7 sum([ :a = 1, :b = 2]) sum([ :a = 1 ]) sum([ :b = 2 ]) func sum pList if plist[:a] = NULL pList[:a] = 4 ok if plist[:b] = NULL pList[:b] = 5 ok see pList[:a] + pList[:b] + nl Output 3 6 6 76.30 How to print keys or values only in List/Dictionary? If you want to print keys only or values only just select the index of the item (one or two). Example C_COUNTRY = 1 C_CITY = 2 mylist = [ :KSA = "Riyadh" , :Egypt = "Cairo" ] for x in mylist see x[C_COUNTRY] + nl next for x in mylist see x[C_CITY] + nl next Output ksa egypt Riyadh Cairo 76.31 Why I get a strange result when printing nl with lists? In the next code list = 1:5 # list = [1,2,3,4,5] see list + nl New Line will be added to the list then the list will be printed, the default print of the lists will print a newline at the end, You added new newline and You have now 2 newlines to be printed. See <Expr> The see command just print the final result of the expression, the expression will be evaluated as it 76.30. How to print keys or values only in List/Dictionary? 870
  • 10.
    Ring Documentation, Release1.7 nl = char(13) + char(10) # just a variable that you can change to anything ! The + is an operator string + string ---> new string string + number ---> new string number + number ---> new number number + string ---> new number list + item —> nothing new will be created but the item will be added to the same list Exception number + nl -> New String This exception is added to easily print numbers then new line. No need for this with printing lists because after printing the last item we already get a new line. 76.32 Could you explain the output of the StrCmp() function? At first remember that you can check strings using ‘=’ operator directly. see strcmp("hello","hello") + nl + strcmp("abc","bcd") + nl + strcmp("bcd","abc") + nl if the two strings are the same then it returns 0 abc and bcd aren’t the same. in the second line it returns -1 and in the third line it returns 1 In the second line we compare between “abc” and “bcd” Not equal because the first letter in “abc” = “a” and the first letter in “bcd” = “b” So we have “a” != “b” and “a” < “b” So we get output = -1 In the third line we have “bcd” and “abc” the first letter in “bcd” is “b” and the first letter in “abc” is “a” So we have “b” != “a” and “b” > “a” So we get output = 1 Note: ASCII(“a”) = 97 and ASCII(“b”) = 98 So “a” < “b” because 97 < 98 76.33 How to use many source code files in the project? Example: I have the next folder C:LRing Contains the next files 76.32. Could you explain the output of the StrCmp() function? 871