SlideShare a Scribd company logo
Ring Documentation, Release 1.2
# Our Class
Class journey
hello=0 it=0 is=0 me=0
func GetHello
See "Hello" + nl
func braceEnd
See "Goodbye!" + nl
We can execute code written in strings using the Eval() function
cCode = "See 'Code that will be executed later!' "
Eval(cCode) # execute the code to print the message
We can create a list then execute code generated from that list
aWords = ["hello","it","is","me"]
for word in aWords cCode=word+"=0" eval(cCode) next
We can read text files using the Read(cFileName) function and we can write files using the Write(cFileName,cString)
function.
See "Enter File Name:" Give cFileName See Read(cFileName) # Print the file content
The next example presents how to create a class that defines two instructions The first instruction is : I want window
The second instruction is : Window title = Expression Also keywords that can be ignored like the ‘the’ keyword
New App
{
I want window
The window title = "hello world"
}
Class App
# Attributes for the instruction I want window
i want window
nIwantwindow = 0
# Attributes for the instruction Window title
# Here we don't define the window attribute again
title
nWindowTitle = 0
# Keywords to ignore, just give them any value
the=0
func geti
if nIwantwindow = 0
nIwantwindow++
ok
func getwant
if nIwantwindow = 1
nIwantwindow++
ok
func getwindow
if nIwantwindow = 2
nIwantwindow= 0
see "Instruction : I want window" + nl
ok
3.9. Define Natural Statements 20
Ring Documentation, Release 1.2
if nWindowTitle = 0
nWindowTitle++
ok
func settitle cValue
if nWindowTitle = 1
nWindowTitle=0
see "Instruction : Window Title = " + cValue + nl
ok
To complete the previous example, use read() to get the content of a file that contains
I want window
The window title = "hello world"
Then use eval() to execute the content of that file!. Also, you can update the methods GetWindow() and SetTitle() to
create Real windows using the GUI Library
3.10 Define Declarative Languages
We learned how to use Natural statements to execute our code and using the same features we can use nested structures
to execute our code.
The next example from the Web library, generate HTML document using the Bootstrap library. No HTML code is
written directly in this example, we created a similar language (just as example) Then using this declarative language
that uses nested structures, we generated the HTML Document.. The idea in this example is that the GetDiv() and
GetH1() methods return an object that we can access using {} and after each object access the method BraceEnd() will
be executed to send the generated HTML to the parent object until we reach to the root where BraceEnd() will print
the output.
Load "weblib.ring"
Import System.Web
Func Main
BootStrapWebPage()
{
div
{
classname = :container
div
{
classname = :jumbotron
H1 { text("Bootstrap Page") }
}
div
{
classname = :row
for x = 1 to 3
div
{
classname = "col-sm-4"
H3 { html("Welcome to the Ring programming language") }
P { html("Using a scripting language is very fun!") }
}
next
}
3.10. Define Declarative Languages 21
Ring Documentation, Release 1.2
}
}
The classes that power the declarative interface looks like this
Class Link from ObjsBase
title link
Func braceend
cOutput = nl+GetTabs() + "<a href='" +
Link + "'> "+ Title + " </a> " + nl
Class Div from ObjsBase
Func braceend
cOutput += nl+'<div'
addattributes()
AddStyle()
getobjsdata()
cOutput += nl+"</div>" + nl
cOutput = TabMLString(cOutput)
3.11 Smart Garbage Collector
Avoid memory problems :-
• Invalid Memory Access
• Memory leaks
• Uninitialized Memory Access
• Dangling pointer
Rules :-
• Global variables always stay in the memory, until you delete these variables using the assignment statement.
• Local variables always deleted after the end of the function.
• The programmer have full control on when to delete the variable from the memory using the Assignment state-
ment.
Example:
aList = [1,2,3,4,5]
aList = "nice"
After the second line directly, The list [1,2,3,4,5] will be deleted from the memory and we will have a string “nice”
• The programmer can call the function callgc() to force running the garbage collector.
• If we have a reference to a variable (when we pass objects and lists to functions), then deleting variables will be
based on reference counting, if no references everything will be deleted, but if we have a reference, the data will
stay in memory.
3.11. Smart Garbage Collector 22
CHAPTER
FOUR
WHAT IS NEW IN RING 1.2?
In this chapter we will learn about the changes and new features in Ring 1.2 release.
4.1 List of changes and new features
Ring 1.2 comes with many new features
• New Functions
• Better Functions
• Better Ring Notepad
• Better RingQt
• Objects Library for RingQt
• RingLibCurl
• Better Call Command
• Using NULL instead of NULLPointer()
• Display Warnings Option
• Better Quality
4.2 New Functions
• PtrCmp() Function is a new function that compare between C pointers like the GUI objects.
• PrevFileName() Function is added to return the previous active source file name.
• RingVM_CFunctionsList() Function is added to return a list of functions written in C.
• RingVM_FunctionsList() Function is added to return a list of functions written in Ring.
• RingVM_ClassesList() Function is added to return a list of Classes.
• RingVM_PackagesList() Function is added to return a list of Packages.
• RingVM_MemoryList() Function is added to return a list of Memory Scopes and Variables.
• RingVM_CallList() Function is added to return a list of the functions call list.
• RingVM_FilesList() Function is added to return a list of the Ring Files.
Example:
23
Ring Documentation, Release 1.2
fp = fopen("ptrcmp.ring","r")
fp2 = fp
fp3 = fopen("ptrcmp.ring","r")
see ptrcmp(fp,fp2) + nl
see ptrcmp(fp,fp3) + nl
fclose(fp)
fclose(fp3)
Output:
1
0
Also we can compare between them using the ‘=’ operator
Example:
fp = fopen("ptrcmp2.ring","r")
fp2 = fopen("ptrcmp2.ring","r")
fp3 = fp
see fp = fp2
see nl
see fp = fp3
fclose(fp)
fclose(fp2)
Output:
0
1
Example:
The next function in stdlib.ring uses the PrevFileName() to know if the file of the caller function is the main source
file of the program or not.
Func IsMainSourceFile
if PrevFileName() = sysargv[2]
return true
ok
return false
4.3 Better Functions
The find() function is updated to support searching in lists using C pointers like GUI Objects.
The type() function is updated to display the C pointers types (like the GUI Object Class Name).
4.4 Better Ring Notepad
The Ring Notepad will save the current line number of opened files to be restored when we switch between files.
Also Ring Notepad will ask the user to save the file if the file content is changed when the user switch between files.
4.3. Better Functions 24
Ring Documentation, Release 1.2
4.5 Better RingQt
RingQt classes are updated to include methods to get events (The code that will be executed when an event is fired).
This is necessary to enable/disable events for some time or to get the events information.
For example the next code disable an event then call a method then enable the event again.
cEvent = oView.oListResult.getCurrentItemChangedEvent()
oView.oListResult.setCurrentItemChangedEvent("")
FindValueAction() # Call Method while an event is disabled
oView.oListResult.setCurrentItemChangedEvent(cEvent)
Also the QAllEvents class is updated where we can set the output from the event function to be true or false using a
new method added to the class called setEventOutput.
Load "guilib.ring"
MyApp = New qApp {
win = new qWidget() {
setwindowtitle("Hello World")
setGeometry(100,100,370,250)
lineedit1 = new qlineedit(win) {
setGeometry(10,100,350,30)
setinputmask("9999;_")
oFilter = new qallevents(lineedit1)
oFilter.setfocusoutEvent("pMove()")
installeventfilter(oFilter)
}
lineedit2 = new qlineedit(win) {
setGeometry(10,150,350,30)
}
show()
}
exec()
}
func pMove
win.setWindowTitle("xxxx")
oFilter.setEventOutput(False)
4.6 Objects Library for RingQt
Ring 1.2 comes with the Objects library for RingQt applications. Instead of using global variables for windows
objects and connecting events to objects using the object name, the Objects Library will manage the GUI objects and
will provide a more natural API to quickly create one or many windows from the same class and the library provide
a way to quickly set methods to be executed when an event is fired. Also the library provide a natural interface to
quickly use the parent or the caller windows from the child or sub windows.
The Objects Library is designed to be used with the MVC Design Pattern.
The Objects Library is merged in RingQt so you can use it directly when you use RingQt
Example :
load "guilib.ring"
new qApp {
4.5. Better RingQt 25
Ring Documentation, Release 1.2
open_window( :MainWindowController )
exec()
}
class MainWindowController from WindowsControllerParent
oView = new MainWindowView
func SubWindowAction
Open_window( :SubWindowController )
Last_Window().SetParentObject(self)
class MainWindowView from WindowsViewBase
win = new qWidget() {
SetWindowTitle("Main Window")
btnSub = new qPushButton(win) {
setText("Sub Window")
setClickEvent( Method( :SubWindowAction ) )
}
resize(400,400)
}
class SubWindowController from WindowsControllerParent
oView = new SubWindowView
func SetMainWindowTitleAction
Parent().oView.win.SetWindowTitle("Message from the Sub Window")
oView.win.SetWindowTitle("Click Event Done!")
class SubWindowView from WindowsViewBase
win = new qWidget() {
SetWindowTitle("Sub Window")
btnMsg = new qPushButton(win) {
setText("Set Main Window Title")
setClickEvent( Method( :SetMainWindowTitleAction ) )
}
btnClose = new qPushButton(win) {
Move(200,0)
setText("Close")
setClickEvent( Method( :CloseAction ) )
}
resize(400,400)
}
4.7 RingLibCurl
The LibCurl library is used starting from Ring 1.0 for the Download() and SendEmail() functions implementation. In
Ring 1.2 more functions are added to provide a powerful library (RingLibCurl) around LibCurl.
Example:
load "libcurl.ring"
curl = curl_easy_init()
cPostThis = "page=4&Number1=4&Number2=5"
curl_easy_setopt(curl, CURLOPT_URL, "http://localhost/ringapp/index.ring?page=3")
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, cPostThis)
4.7. RingLibCurl 26
Ring Documentation, Release 1.2
curl_easy_perform(curl)
curl_easy_cleanup(curl)
4.8 Better Call Command
The Call command is updated to support calling functions from object attributes also (not only variables).
For example the next code from the Stars Fighter Game
cFunc = oself.keypress
call cFunc(oGame,oSelf,Key_Space)
Can be written in one line
call oself.keypress(oGame,oSelf,Key_Space)
4.9 Using NULL instead of NULLPointer()
We can pass NULL to functions instead of using NULLPointer()
For example the next code from RingLibSDL
SDL_RenderCopy(SDL_ren,tex,NULLPointer(),rect)
Can be written as in the next line
SDL_RenderCopy(SDL_ren,tex,NULL,rect)
4.10 Display Warnings Option
In Ring 1.2 the Ring compiler is updated to include the Display Warnings option (-w)
Example:
load "stdlib.ring"
load "stdlib.ring"
compiling the program using the Display Warnings option will display the file duplication warning, While without that
option the error will pass silent.
This is a warning (not an error) because in large projects you may use the same file more than one time. For example
it’s common to start each file with the next code. where the function IsMainSourceFile() is part from the stdlib.ring
load "stdlib.ring"
if IsMainSourceFile()
// Testing
ok
4.8. Better Call Command 27
Ring Documentation, Release 1.2
4.11 Better Quality
Ring 1.2 is more stable, We discovered and fixed more bugs during Ring usage everyday in practical projects. Some
functions are optimized to be faster like the SubStr() function. Also the documentation is more better.
4.11. Better Quality 28
CHAPTER
FIVE
WHAT IS NEW IN RING 1.1?
In this chapter we will learn about the changes and new features in Ring 1.1 release.
5.1 List of changes and new features
Ring 1.1 comes with many new features
• Better Natural Language Programming Support
• Generate/Execute Ring Object Files (*.ringo)
• Syntax Flexibility and different styles for I/O and Control Structures
• New Functions and Changes
• StdLib functions and classes written in Ring
• RingLibSDL
• Demo Project - Game Engine for 2D Games
• RingSQLite
• Better Code Generator for Extensions
• Using Self.Attribute in the Class Region to define new attributes
• Using This.Attribute in nested Braces inside the Class Methods
• Better Documentation
5.2 Better Natural Language Programming Support
Ring is an innovative language because of it’s compact syntax, smart implementation (small, transparent & visual) and
it’s ability to create declarative and natural domain specific languages in a fraction of time.
This release add support for calling methods when an expression is evaluated
check this example:
# Natural Code
new program {
Accept 2 numbers then print the sum
}
# Natural Code Implementation
29

More Related Content

PDF
The Ring programming language version 1.3 book - Part 5 of 88
PDF
Taming Core Data by Arek Holko, Macoscope
DOCX
Java programming lab_manual_by_rohit_jaiswar
PDF
The Ring programming language version 1.7 book - Part 7 of 196
PDF
Java Lab Manual
PDF
The Ring programming language version 1.5.2 book - Part 39 of 181
PPTX
Functional Reactive Programming (FRP): Working with RxJS
PDF
Advanced Java Practical File
The Ring programming language version 1.3 book - Part 5 of 88
Taming Core Data by Arek Holko, Macoscope
Java programming lab_manual_by_rohit_jaiswar
The Ring programming language version 1.7 book - Part 7 of 196
Java Lab Manual
The Ring programming language version 1.5.2 book - Part 39 of 181
Functional Reactive Programming (FRP): Working with RxJS
Advanced Java Practical File

What's hot (20)

PDF
C++ Windows Forms L07 - Collections
DOC
Advanced Java - Praticals
PPT
Thread
PDF
Hadoop + Clojure
PDF
Java programming lab manual
PDF
C# Starter L02-Classes and Objects
DOCX
descriptive programming
PDF
Using Combine, SwiftUI and callAsFunction to build an experimental localizati...
PDF
C# Starter L04-Collections
PPTX
คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น
PPTX
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
PDF
Java Programming - 06 java file io
PDF
PDF
The Ring programming language version 1.10 book - Part 102 of 212
KEY
Clojure Intro
PDF
Design Patterns Reconsidered
PDF
Backbone.js: Run your Application Inside The Browser
DOCX
Java PRACTICAL file
PDF
Intro to JavaScript
PDF
AWS Java SDK @ scale
C++ Windows Forms L07 - Collections
Advanced Java - Praticals
Thread
Hadoop + Clojure
Java programming lab manual
C# Starter L02-Classes and Objects
descriptive programming
Using Combine, SwiftUI and callAsFunction to build an experimental localizati...
C# Starter L04-Collections
คลาสและการเขียนโปรแกรมเชิงวัตถุเบื้องต้น
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Java Programming - 06 java file io
The Ring programming language version 1.10 book - Part 102 of 212
Clojure Intro
Design Patterns Reconsidered
Backbone.js: Run your Application Inside The Browser
Java PRACTICAL file
Intro to JavaScript
AWS Java SDK @ scale
Ad

Viewers also liked (6)

PDF
How to stand out online
PDF
2012 and We're STILL Using PowerPoint Wrong
PDF
Your Speech is Toxic
PDF
Great Speakers Tell Stories
PDF
Slides That Rock
PDF
SMOKE - The Convenient Truth [1st place Worlds Best Presentation Contest] by ...
How to stand out online
2012 and We're STILL Using PowerPoint Wrong
Your Speech is Toxic
Great Speakers Tell Stories
Slides That Rock
SMOKE - The Convenient Truth [1st place Worlds Best Presentation Contest] by ...
Ad

Similar to The Ring programming language version 1.2 book - Part 5 of 84 (20)

PDF
The Ring programming language version 1.5.4 book - Part 14 of 185
PDF
The Ring programming language version 1.10 book - Part 21 of 212
PDF
The Ring programming language version 1.9 book - Part 20 of 210
PDF
The Ring programming language version 1.4 book - Part 3 of 30
PDF
The Ring programming language version 1.5.3 book - Part 14 of 184
PDF
The Ring programming language version 1.5.1 book - Part 12 of 180
PDF
The Ring programming language version 1.8 book - Part 18 of 202
PDF
The Ring programming language version 1.6 book - Part 16 of 189
PDF
The Ring programming language version 1.7 book - Part 16 of 196
PDF
The Ring programming language version 1.5.1 book - Part 13 of 180
PDF
The Ring programming language version 1.5.2 book - Part 13 of 181
PDF
The Ring programming language version 1.6 book - Part 15 of 189
PDF
The Ring programming language version 1.3 book - Part 7 of 88
PDF
The Ring programming language version 1.5.2 book - Part 6 of 181
PDF
The Ring programming language version 1.5.1 book - Part 6 of 180
PDF
The Ring programming language version 1.5 book - Part 3 of 31
PDF
The Ring programming language version 1.8 book - Part 7 of 202
PDF
The Ring programming language version 1.5.2 book - Part 14 of 181
PDF
The Ring programming language version 1.7 book - Part 17 of 196
PDF
The Ring programming language version 1.6 book - Part 184 of 189
The Ring programming language version 1.5.4 book - Part 14 of 185
The Ring programming language version 1.10 book - Part 21 of 212
The Ring programming language version 1.9 book - Part 20 of 210
The Ring programming language version 1.4 book - Part 3 of 30
The Ring programming language version 1.5.3 book - Part 14 of 184
The Ring programming language version 1.5.1 book - Part 12 of 180
The Ring programming language version 1.8 book - Part 18 of 202
The Ring programming language version 1.6 book - Part 16 of 189
The Ring programming language version 1.7 book - Part 16 of 196
The Ring programming language version 1.5.1 book - Part 13 of 180
The Ring programming language version 1.5.2 book - Part 13 of 181
The Ring programming language version 1.6 book - Part 15 of 189
The Ring programming language version 1.3 book - Part 7 of 88
The Ring programming language version 1.5.2 book - Part 6 of 181
The Ring programming language version 1.5.1 book - Part 6 of 180
The Ring programming language version 1.5 book - Part 3 of 31
The Ring programming language version 1.8 book - Part 7 of 202
The Ring programming language version 1.5.2 book - Part 14 of 181
The Ring programming language version 1.7 book - Part 17 of 196
The Ring programming language version 1.6 book - Part 184 of 189

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)

PDF
How Creative Agencies Leverage Project Management Software.pdf
PDF
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
PDF
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
PDF
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
PDF
Odoo Companies in India – Driving Business Transformation.pdf
PPTX
Odoo POS Development Services by CandidRoot Solutions
PDF
How to Migrate SBCGlobal Email to Yahoo Easily
PDF
2025 Textile ERP Trends: SAP, Odoo & Oracle
PDF
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
PPTX
Operating system designcfffgfgggggggvggggggggg
PDF
Digital Strategies for Manufacturing Companies
PDF
PTS Company Brochure 2025 (1).pdf.......
PPTX
ManageIQ - Sprint 268 Review - Slide Deck
PDF
Softaken Excel to vCard Converter Software.pdf
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
PPTX
ai tools demonstartion for schools and inter college
PDF
Which alternative to Crystal Reports is best for small or large businesses.pdf
PDF
Wondershare Filmora 15 Crack With Activation Key [2025
PDF
Upgrade and Innovation Strategies for SAP ERP Customers
PPTX
VVF-Customer-Presentation2025-Ver1.9.pptx
How Creative Agencies Leverage Project Management Software.pdf
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
Odoo Companies in India – Driving Business Transformation.pdf
Odoo POS Development Services by CandidRoot Solutions
How to Migrate SBCGlobal Email to Yahoo Easily
2025 Textile ERP Trends: SAP, Odoo & Oracle
T3DD25 TYPO3 Content Blocks - Deep Dive by André Kraus
Operating system designcfffgfgggggggvggggggggg
Digital Strategies for Manufacturing Companies
PTS Company Brochure 2025 (1).pdf.......
ManageIQ - Sprint 268 Review - Slide Deck
Softaken Excel to vCard Converter Software.pdf
Internet Downloader Manager (IDM) Crack 6.42 Build 42 Updates Latest 2025
ai tools demonstartion for schools and inter college
Which alternative to Crystal Reports is best for small or large businesses.pdf
Wondershare Filmora 15 Crack With Activation Key [2025
Upgrade and Innovation Strategies for SAP ERP Customers
VVF-Customer-Presentation2025-Ver1.9.pptx

The Ring programming language version 1.2 book - Part 5 of 84

  • 1. Ring Documentation, Release 1.2 # Our Class Class journey hello=0 it=0 is=0 me=0 func GetHello See "Hello" + nl func braceEnd See "Goodbye!" + nl We can execute code written in strings using the Eval() function cCode = "See 'Code that will be executed later!' " Eval(cCode) # execute the code to print the message We can create a list then execute code generated from that list aWords = ["hello","it","is","me"] for word in aWords cCode=word+"=0" eval(cCode) next We can read text files using the Read(cFileName) function and we can write files using the Write(cFileName,cString) function. See "Enter File Name:" Give cFileName See Read(cFileName) # Print the file content The next example presents how to create a class that defines two instructions The first instruction is : I want window The second instruction is : Window title = Expression Also keywords that can be ignored like the ‘the’ keyword New App { I want window The window title = "hello world" } Class App # Attributes for the instruction I want window i want window nIwantwindow = 0 # Attributes for the instruction Window title # Here we don't define the window attribute again title nWindowTitle = 0 # Keywords to ignore, just give them any value the=0 func geti if nIwantwindow = 0 nIwantwindow++ ok func getwant if nIwantwindow = 1 nIwantwindow++ ok func getwindow if nIwantwindow = 2 nIwantwindow= 0 see "Instruction : I want window" + nl ok 3.9. Define Natural Statements 20
  • 2. Ring Documentation, Release 1.2 if nWindowTitle = 0 nWindowTitle++ ok func settitle cValue if nWindowTitle = 1 nWindowTitle=0 see "Instruction : Window Title = " + cValue + nl ok To complete the previous example, use read() to get the content of a file that contains I want window The window title = "hello world" Then use eval() to execute the content of that file!. Also, you can update the methods GetWindow() and SetTitle() to create Real windows using the GUI Library 3.10 Define Declarative Languages We learned how to use Natural statements to execute our code and using the same features we can use nested structures to execute our code. The next example from the Web library, generate HTML document using the Bootstrap library. No HTML code is written directly in this example, we created a similar language (just as example) Then using this declarative language that uses nested structures, we generated the HTML Document.. The idea in this example is that the GetDiv() and GetH1() methods return an object that we can access using {} and after each object access the method BraceEnd() will be executed to send the generated HTML to the parent object until we reach to the root where BraceEnd() will print the output. Load "weblib.ring" Import System.Web Func Main BootStrapWebPage() { div { classname = :container div { classname = :jumbotron H1 { text("Bootstrap Page") } } div { classname = :row for x = 1 to 3 div { classname = "col-sm-4" H3 { html("Welcome to the Ring programming language") } P { html("Using a scripting language is very fun!") } } next } 3.10. Define Declarative Languages 21
  • 3. Ring Documentation, Release 1.2 } } The classes that power the declarative interface looks like this Class Link from ObjsBase title link Func braceend cOutput = nl+GetTabs() + "<a href='" + Link + "'> "+ Title + " </a> " + nl Class Div from ObjsBase Func braceend cOutput += nl+'<div' addattributes() AddStyle() getobjsdata() cOutput += nl+"</div>" + nl cOutput = TabMLString(cOutput) 3.11 Smart Garbage Collector Avoid memory problems :- • Invalid Memory Access • Memory leaks • Uninitialized Memory Access • Dangling pointer Rules :- • Global variables always stay in the memory, until you delete these variables using the assignment statement. • Local variables always deleted after the end of the function. • The programmer have full control on when to delete the variable from the memory using the Assignment state- ment. Example: aList = [1,2,3,4,5] aList = "nice" After the second line directly, The list [1,2,3,4,5] will be deleted from the memory and we will have a string “nice” • The programmer can call the function callgc() to force running the garbage collector. • If we have a reference to a variable (when we pass objects and lists to functions), then deleting variables will be based on reference counting, if no references everything will be deleted, but if we have a reference, the data will stay in memory. 3.11. Smart Garbage Collector 22
  • 4. CHAPTER FOUR WHAT IS NEW IN RING 1.2? In this chapter we will learn about the changes and new features in Ring 1.2 release. 4.1 List of changes and new features Ring 1.2 comes with many new features • New Functions • Better Functions • Better Ring Notepad • Better RingQt • Objects Library for RingQt • RingLibCurl • Better Call Command • Using NULL instead of NULLPointer() • Display Warnings Option • Better Quality 4.2 New Functions • PtrCmp() Function is a new function that compare between C pointers like the GUI objects. • PrevFileName() Function is added to return the previous active source file name. • RingVM_CFunctionsList() Function is added to return a list of functions written in C. • RingVM_FunctionsList() Function is added to return a list of functions written in Ring. • RingVM_ClassesList() Function is added to return a list of Classes. • RingVM_PackagesList() Function is added to return a list of Packages. • RingVM_MemoryList() Function is added to return a list of Memory Scopes and Variables. • RingVM_CallList() Function is added to return a list of the functions call list. • RingVM_FilesList() Function is added to return a list of the Ring Files. Example: 23
  • 5. Ring Documentation, Release 1.2 fp = fopen("ptrcmp.ring","r") fp2 = fp fp3 = fopen("ptrcmp.ring","r") see ptrcmp(fp,fp2) + nl see ptrcmp(fp,fp3) + nl fclose(fp) fclose(fp3) Output: 1 0 Also we can compare between them using the ‘=’ operator Example: fp = fopen("ptrcmp2.ring","r") fp2 = fopen("ptrcmp2.ring","r") fp3 = fp see fp = fp2 see nl see fp = fp3 fclose(fp) fclose(fp2) Output: 0 1 Example: The next function in stdlib.ring uses the PrevFileName() to know if the file of the caller function is the main source file of the program or not. Func IsMainSourceFile if PrevFileName() = sysargv[2] return true ok return false 4.3 Better Functions The find() function is updated to support searching in lists using C pointers like GUI Objects. The type() function is updated to display the C pointers types (like the GUI Object Class Name). 4.4 Better Ring Notepad The Ring Notepad will save the current line number of opened files to be restored when we switch between files. Also Ring Notepad will ask the user to save the file if the file content is changed when the user switch between files. 4.3. Better Functions 24
  • 6. Ring Documentation, Release 1.2 4.5 Better RingQt RingQt classes are updated to include methods to get events (The code that will be executed when an event is fired). This is necessary to enable/disable events for some time or to get the events information. For example the next code disable an event then call a method then enable the event again. cEvent = oView.oListResult.getCurrentItemChangedEvent() oView.oListResult.setCurrentItemChangedEvent("") FindValueAction() # Call Method while an event is disabled oView.oListResult.setCurrentItemChangedEvent(cEvent) Also the QAllEvents class is updated where we can set the output from the event function to be true or false using a new method added to the class called setEventOutput. Load "guilib.ring" MyApp = New qApp { win = new qWidget() { setwindowtitle("Hello World") setGeometry(100,100,370,250) lineedit1 = new qlineedit(win) { setGeometry(10,100,350,30) setinputmask("9999;_") oFilter = new qallevents(lineedit1) oFilter.setfocusoutEvent("pMove()") installeventfilter(oFilter) } lineedit2 = new qlineedit(win) { setGeometry(10,150,350,30) } show() } exec() } func pMove win.setWindowTitle("xxxx") oFilter.setEventOutput(False) 4.6 Objects Library for RingQt Ring 1.2 comes with the Objects library for RingQt applications. Instead of using global variables for windows objects and connecting events to objects using the object name, the Objects Library will manage the GUI objects and will provide a more natural API to quickly create one or many windows from the same class and the library provide a way to quickly set methods to be executed when an event is fired. Also the library provide a natural interface to quickly use the parent or the caller windows from the child or sub windows. The Objects Library is designed to be used with the MVC Design Pattern. The Objects Library is merged in RingQt so you can use it directly when you use RingQt Example : load "guilib.ring" new qApp { 4.5. Better RingQt 25
  • 7. Ring Documentation, Release 1.2 open_window( :MainWindowController ) exec() } class MainWindowController from WindowsControllerParent oView = new MainWindowView func SubWindowAction Open_window( :SubWindowController ) Last_Window().SetParentObject(self) class MainWindowView from WindowsViewBase win = new qWidget() { SetWindowTitle("Main Window") btnSub = new qPushButton(win) { setText("Sub Window") setClickEvent( Method( :SubWindowAction ) ) } resize(400,400) } class SubWindowController from WindowsControllerParent oView = new SubWindowView func SetMainWindowTitleAction Parent().oView.win.SetWindowTitle("Message from the Sub Window") oView.win.SetWindowTitle("Click Event Done!") class SubWindowView from WindowsViewBase win = new qWidget() { SetWindowTitle("Sub Window") btnMsg = new qPushButton(win) { setText("Set Main Window Title") setClickEvent( Method( :SetMainWindowTitleAction ) ) } btnClose = new qPushButton(win) { Move(200,0) setText("Close") setClickEvent( Method( :CloseAction ) ) } resize(400,400) } 4.7 RingLibCurl The LibCurl library is used starting from Ring 1.0 for the Download() and SendEmail() functions implementation. In Ring 1.2 more functions are added to provide a powerful library (RingLibCurl) around LibCurl. Example: load "libcurl.ring" curl = curl_easy_init() cPostThis = "page=4&Number1=4&Number2=5" curl_easy_setopt(curl, CURLOPT_URL, "http://localhost/ringapp/index.ring?page=3") curl_easy_setopt(curl, CURLOPT_POSTFIELDS, cPostThis) 4.7. RingLibCurl 26
  • 8. Ring Documentation, Release 1.2 curl_easy_perform(curl) curl_easy_cleanup(curl) 4.8 Better Call Command The Call command is updated to support calling functions from object attributes also (not only variables). For example the next code from the Stars Fighter Game cFunc = oself.keypress call cFunc(oGame,oSelf,Key_Space) Can be written in one line call oself.keypress(oGame,oSelf,Key_Space) 4.9 Using NULL instead of NULLPointer() We can pass NULL to functions instead of using NULLPointer() For example the next code from RingLibSDL SDL_RenderCopy(SDL_ren,tex,NULLPointer(),rect) Can be written as in the next line SDL_RenderCopy(SDL_ren,tex,NULL,rect) 4.10 Display Warnings Option In Ring 1.2 the Ring compiler is updated to include the Display Warnings option (-w) Example: load "stdlib.ring" load "stdlib.ring" compiling the program using the Display Warnings option will display the file duplication warning, While without that option the error will pass silent. This is a warning (not an error) because in large projects you may use the same file more than one time. For example it’s common to start each file with the next code. where the function IsMainSourceFile() is part from the stdlib.ring load "stdlib.ring" if IsMainSourceFile() // Testing ok 4.8. Better Call Command 27
  • 9. Ring Documentation, Release 1.2 4.11 Better Quality Ring 1.2 is more stable, We discovered and fixed more bugs during Ring usage everyday in practical projects. Some functions are optimized to be faster like the SubStr() function. Also the documentation is more better. 4.11. Better Quality 28
  • 10. CHAPTER FIVE WHAT IS NEW IN RING 1.1? In this chapter we will learn about the changes and new features in Ring 1.1 release. 5.1 List of changes and new features Ring 1.1 comes with many new features • Better Natural Language Programming Support • Generate/Execute Ring Object Files (*.ringo) • Syntax Flexibility and different styles for I/O and Control Structures • New Functions and Changes • StdLib functions and classes written in Ring • RingLibSDL • Demo Project - Game Engine for 2D Games • RingSQLite • Better Code Generator for Extensions • Using Self.Attribute in the Class Region to define new attributes • Using This.Attribute in nested Braces inside the Class Methods • Better Documentation 5.2 Better Natural Language Programming Support Ring is an innovative language because of it’s compact syntax, smart implementation (small, transparent & visual) and it’s ability to create declarative and natural domain specific languages in a fraction of time. This release add support for calling methods when an expression is evaluated check this example: # Natural Code new program { Accept 2 numbers then print the sum } # Natural Code Implementation 29