What is new in Ring 1.8?

In this chapter we will learn about the changes and new features in Ring 1.8 release.

List of changes and new features

Ring 1.8 comes with the next features!

  • Better Performance

  • Find in files Application

  • String2Constant Application

  • StopWatch Application

  • More 3D Samples

  • Compiling on Manjaro Linux

  • Using This in the class region as Self

  • Default value for object attributes is NULL

  • The For Loops uses the local scope

  • Merge binary characters

  • FoxRing Library

  • Better Form Designer

  • Better Cards Game

  • Better RingQt

  • Better Code Generator For Extensions

  • Better Ring Compiler and VM

  • Notes to extensions creators

Better Performance

Ring 1.8 is faster than Ring 1.7

The performance gain is between 10% and 100% based on the application.

Check the 3D samples in this release to get an idea about the current performance.

For more information check the Performance Tips chapter.

Find in files Application

Ring 1.8 comes with Find in files application

Find in files

String2Constant Application

Ring 1.8 comes with String2Constant application

Using this tool we can convert the source code to be based on constants instead of string literals

Then we can store constants in separate source code files that we can translate to different languages

Where we can have special file for each language, like (English.ring, Arabic.ring and so on)

Using this simple tool, the Form Designer is translated to the Arabic language.

For more information check the Multi-language Applications chapter.

String2Constant

StopWatch Application

Ring 1.8 comes with StopWatch application

StopWatch

More 3D Samples

Ring 1.8 comes with more 3D Samples

The next screen shot for the Top-Down view - Many levels of cubes sample

3D samples

The next screen shot for the Camera Sample

3D samples

The next screen shot for the Camera and background sample

Developer : Azzeddine Remmal

Camera and background

Compiling on Manjaro Linux

Ring 1.8 is tested on Manjaro Linux too

Tests by : Iip Rifai

Ring on Manjaro Linux

Using This in the class region as Self

The class region is the region that comes after the class name and before any method.

Now we can use This in the class region as Self.

Example:

func main

        o1 = new program {
                test()
        }

        ? o1

class program

        this.name = "My Application"
        this.version = "1.0"
        ? name ? version

        func test
                ? "Name    = " + name
                ? "Version = " + version

Output

My Application
1.0
Name    = My Application
Version = 1.0
name: My Application
version: 1.0

Note

When we use braces to change the current active object, Using This we can still point to the class.

Tip

The difference between This and Self is that Self point to the current active object that we can change using braces.

Remember that in most cases we don’t need to use This or Self in the class region

We can write

class program name version

Or

class program name="My Application" version="1.0"

Note

We use This or Self in the class region just to avoid conflict with global variables that are defined with the same name.

Default value for object attributes is NULL

Starting from Ring 1.8 the default value for object attributes is NULL

In Ring, the NULL value is just an empty string or a string that contains “NULL”

We can check for NULL values using the isNULL() function

Example:

oProgram = new Program
? oProgram.name
? oProgram.version
? isNULL(oProgram.name)
? isNULL(oProgram.version)
oProgram { name="My Application" version="1.0" }
? isNULL(oProgram.name)
? isNULL(oProgram.version)
? oProgram

class program
        name
        version

Output:

NULL
NULL
1
1
0
0
name: My Application
version: 1.0

In previous versions of Ring, trying to access the object attribute before assigning a value to it

Will lead to runtime error and you can’t check it using isnull()

The only way was assigning a value or using try/catch/end

We changed this behavior so we can have full control in seamless way.

The For Loops uses the local scope

In Ring 1.8, when the For Loop defines new identifier (variable) it will define it in the local scope.

Example:

x = 10
? x             # Print 10
test1()
? x             # Print 10
test2()
? x             # Print 10

func test1
        for x = 1 to 5
        next
        ? x     # Print 6

func test2
        list = 1:5
        for x in list
        next
        ? x     # Print NULL (The "For In" loop will kill the reference after the loop)

Output:

10
6
10
NULL
10

Merge binary characters

From Ring 1.0 we can create binary strings and do operations on these strings.

Now in Ring 1.8, we can get individual characters from these strings and merge them together using the ‘+’ operator.

Example:

cStr = "Welcome"
? cstr[1] + cstr[2] + cStr[5]
v = cstr[1] + cstr[2] + cStr[5]
? v
? len(v)
c1 = cStr[1]
? c1
aList = [1,2,3]
cStr = ""
for item in aList
        cStr += int2bytes(item)
next
? "All String"
? len(cStr)
? "First Part"
n1 = cStr[1] + cStr[2] + cStr[3] + cStr[4]
? len(n1)
? "Second Part"
n2 = cStr[5] + cStr[6] + cStr[7] + cStr[8]
? len(n2)
? "Third Part"
n3 = cStr[9] + cStr[10] + cStr[11] + cStr[12]
? len(n3)
? "All String"
cString = cStr[1] + cStr[2] + cStr[3] + cStr[4] +
          cStr[5] + cStr[6] + cStr[7] + cStr[8] +
          cStr[9] + cStr[10] + cStr[11] + cStr[12]
? len(cString)
? ascii(cStr[1])
? len(cStr[2])

Output:

Weo
Weo
3
W
All String
12
First Part
4
Second Part
4       
Third Part
4
All String
12
1
1

FoxRing Library

Developer: Jose Rosado

A class with some of the functions I used in FoxPro

Example:

Load "foxring.ring"

mf = new frFunctions
? mf.frAbs(-45)
? mf.frAbs(10-30)
? mf.frAbs(30-10)

? mf.frTransform("    Ring is a good language    ",
                 "@! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
? mf.frAllTrim("    Ring is a good language    ", Null)

Output:

45
20
20
    RING IS A GOOD LANGUAGE
Ring is a good language

Better Form Designer

  1. Layout Control - Display the control name when loading forms.

  2. Button Control - Display the button images written using relative path.

  3. Table Control - Display the control name when loading forms.

  4. Better behavior in “Bring to front” and “Send to back” operations.

  5. New buttons are added to the toolbar (Duplicate, Bring to front, Send to back, Delete).

  6. Using layouts in (Menubar designer, Window Flags window, Selecting Objects window).

  7. Better behavior for displaying the properties window when changing the selected objects.

  8. New buttons are added to move and resize multiple selection of objects.

  9. Window Properties - Add button to select the layout.

  10. Opening forms and switching between files is faster.

  11. Objects Order window.

  12. Select Objects window.

  13. When we change the control name, the name will be updated in layout objects.

Better Cards Game

The Cards game is updated and we can play with the Computer

Cards Main Menu

Better RingQt

  • The next classes are added to RingQt

  1. QTabBar

  2. QFile

  3. QFileDevice

  4. QStandardPaths

  5. QDir

  6. QQuickWidget

  7. QQmlError

  8. QScrollBar

  • RingQt for Android is updated to support modern versions of Qt

Tested using

  1. Qt 5.5.1

  2. Qt 5.9.5

  3. Qt 5.11.0

  • In RingQt for Android, The Ring Object File (ringo) will be executed directly from resources.

Better Code Generator For Extensions

New Option: StaticMethods

Starting from Ring 1.8 the code generator support the staticmethods option.

So the code generator can know that the class doesn’t need an object to call the methods.

Example:

<class>
name: QStandardPaths
para: void
nonew
staticmethods
</class>

QString displayName(QStandardPaths::StandardLocation type)
QString findExecutable(QString executableName, QStringList paths))

Better Ring Compiler and VM

  1. Better loading for files in relative paths

  2. Code Optimization for eval() function

  3. Better Memory Pool

  4. When embedding Ring in Ring, the error in the hosted environment will not close the host

Example:

? "Start the test!"

pState = ring_state_init()

ring_state_runcode(pState," ? 'Let us try having an error' ? x")

ring_state_delete(pState)

? ""
? "End of test!"

Output:

Start the test!
Let us try having an error

Line 1 Error (R24) : Using uninitialized variable : x
in file Ring_EmbeddedCode
End of test!
  1. The compiler will ignore new lines after keywords that expect tokens after it

Example:

see
"
        Hello, World!
"
test()

func
#======================#
        Test
#======================#

        ?
        "

        Hello from the Test function

        "

Output:

Hello, World!


Hello from the Test function
  1. Better code (faster) for the main loop, special loop for eval() function.

  2. Better code (faster) for tracking C pointers to avoid using NULL pointers.

  3. Better code (faster) for getting the self object using braces.

Notes to extensions creators

If you have created new extensions for Ring in the C/C++ languages.

You have to rebuild your extension (Generate the DLL file again using Ring 1.8 header files) before usage with Ring 1.8

Because we changed the internal structure of the VM, but no changes to the code are required. just rebuild.