.. index:: single: What is new in Ring 1.1?; Introduction ======================== What is new in Ring 1.1? ======================== In this chapter we will learn about the changes and new features in Ring 1.1 release. .. index:: pair: What is new in Ring 1.1?; List of changes and new features 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 .. index:: pair: What is new in Ring 1.1?; Better Natural Language Programming Support 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: .. code-block:: ring # Natural Code new program { Accept 2 numbers then print the sum } # Natural Code Implementation class program # Keywords Accept=0 numbers=0 then=0 print=0 the=0 sum=0 # Execution func braceexpreval x value = x func getnumbers for x=1 to value see "Enter Number ("+x+") :" give nNumber aNumbers + nNumber next func getsum nSUm = 0 for x in aNumbers nSum+= x next see "The Sum : " + nSum private value=0 aNumbers=[] Output: .. code-block:: ring Enter Number (1) :3 Enter Number (2) :4 The Sum : 7 for more information see the "Natural Language Programming" chapter. .. index:: pair: What is new in Ring 1.1?; Generate/Execute Ring Object Files (*.ringo) Generate/Execute Ring Object Files (*.ringo) ============================================ This feature enable you to distribute your applications without distributing the source code. Also it makes application distribution a simple process where you get one Ring object file for the complete project (many source code files). Also using Ring object file remove the loading time required for compiling the application. Check the "command line options" chapter to know more about this feature. .. index:: pair: What is new in Ring 1.1?; Syntax Flexibility Syntax Flexibility and different styles for I/O and Control Structures ====================================================================== Programmers are sensitive to the programming language syntax. Great programmers know how to work using many different styles but each programmer may have his/her favorite style. Each programming language comes with a style that you may like or not. Ring is just one of these languages, but as a response to many programmers asking for a better syntax we decided to provide more options. Also some of these features are very necessary for Natural Language Programming. Example : We have two commands to change language keywords and operators. .. code-block:: ring ChangeRingOperator + plus ChangeRingKeyword see print Print 5 plus 5 ChangeRingOperator plus + ChangeRingKeyword print see We have new styles (Optional) for Input/Output. Example : .. code-block:: ring Put "What is your name? " Get cName Put "Hello " + cName Example : .. code-block:: ring Load "stdlib.ring" Print("What is your name? ") # print message on screen cName=GetString() # get input from the user print("Hello #{cName}") # say hello! We have new styles (optional) for control structures. Example : .. code-block:: ring While True Put " Main Menu --------- (1) Say Hello (2) About (3) Exit " Get nOption Switch nOption Case 1 Put "Enter your name : " Get name Put "Hello " + name + nl Case 2 Put "Sample : using while loop" + nl Case 3 Bye Else Put "bad option..." + nl End End Example : .. code-block:: ring Load "stdlib.ring" While True { print(" Main Menu --------- (1) Say Hello (2) About (3) Exit ") nOption = GetString() switch nOption { case 1 print("Enter your name : ") name = getstring() print("Hello #{name}\n") case 2 print("Sample : using switch statement\n") case 3 Bye else print("bad option...\n") } } Check the next chapters:- * Getting Started - Second Style * Getting Started - Third Style * Control Structures - Second Style - May looks like Lua and Ruby * Control Structures - Third Style - May looks like C (uses braces) * Syntax Flexibility .. note:: All of these styles are provided automatically by the compiler at the same time, It's better to select one style for the same project (you can create your style as a mix from these styles) for example you can use Put/Get and Braces. .. index:: pair: What is new in Ring 1.1?; New Functions and Changes New Functions and Changes ========================= Changed: * get() function : changed to sysget() * sort() function : can now work on list of objects * find() function : can now work on list of objects Added: * clockspersecond() * CurrentDir() * ExeFileName() * ChDir() * ExeFolder() * varptr() * space() * nullpointer() * object2pointer() * pointer2object() Check the next chapters * System Functions * Object Oriented Programming (OOP) * Low Level Functions .. index:: pair: What is new in Ring 1.1?; StdLib functions and classes written in Ring StdLib functions and classes written in Ring ============================================ Ring 1.1 comes with a library called StdLib, it's written in Ring by the help of Ring Team The library provide a useful group of new functions and classes Example: .. code-block:: ring Load "stdlib.ring" Puts("Test Times()") Times ( 3 , func { see "Hello, World!" + nl } ) Example: .. code-block:: ring Load "stdlib.ring" Puts("Test Map()") See Map( 1:10, func x { return x*x } ) Example: .. code-block:: ring Load "stdlib.ring" Puts("Test Filter()") See Filter( 1:10 , func x { if x <= 5 return true else return false ok } ) Example: .. code-block:: ring Load "stdlib.ring" See "Testing the String Class" + nl oString = new string("Hello, World!") oString.println() oString.upper().println() oString.lower().println() oString.left(5).println() oString.right(6).println() Example: .. code-block:: ring Load "stdlib.ring" oList = new list ( [1,2,3] ) oList.Add(4) oList.print() Example: .. code-block:: ring Load "stdlib.ring" oStack = new Stack oStack.push(1) oStack.push(2) oStack.push(3) see oStack.pop() + nl Example: .. code-block:: ring Load "stdlib.ring" oQueue = new Queue oQueue.add(1) oQueue.add(2) oQueue.add(3) see oQueue.remove() + nl Example: .. code-block:: ring Load "stdlib.ring" ohashtable = new hashtable See "Test the hashtable Class Methods" + nl ohashtable { Add("Egypt","Cairo") Add("KSA","Riyadh") see self["Egypt"] + nl see self["KSA"] + nl see contains("Egypt") + nl see contains("USA") + nl see index("KSA") + NL print() delete(index("KSA")) see copy("*",60) + nl print() } Example: .. code-block:: ring Load "stdlib.ring" otree = new tree See "Test the tree Class Methods" + nl otree { set("The first step") # set the root node value see value() + nl Add("one") Add("two") Add("three") { Add("3.1") Add("3.2") Add("3.3") see children } see children oTree.children[2] { Add("2.1") Add("2.2") Add("2.3") { Add("2.3.1") Add("2.3.2") Add("test") } } oTree.children[2].children[3].children[3].set("2.3.3") } see copy("*",60) + nl oTree.print() Check the next chapters: * StdLib Functions * StdLib Classes .. index:: pair: What is new in Ring 1.1?; RingLibSDL RingLibSDL ========== Ring 1.0 provided RingAllegro to be able to create games using the Allegro game programming library Now Ring 1.1 provide RingLibSDL also so we can have the choice between Allegro or LibSDL Example: .. code-block:: ring Load "libsdl.ring" SDL_Init(SDL_INIT_EVERYTHING) win = SDL_CreateWindow("Hello World!", 100, 100, 640, 480, SDL_WINDOW_SHOWN) SDL_Delay(2000) SDL_DestroyWindow(win) SDL_Quit() See the RingLibSDL Chapter. .. index:: pair: What is new in Ring 1.1?; Game Engine for 2D Games Demo Project - Game Engine for 2D Games ======================================= In practice we would create a game engine in a language like C/C++ to get the best performance then provide Ring classes to use the engine. But many 2D Games are simple and creating a game engine in Ring will be fast enough in many cases Also this would be a good demo project to learn about the language concepts where we build things using Object Oriented Programming (OOP) then access the power that we have using declarative programming using nested structures or using natural programming. In this project we selected the first way (declarative programming using nested structures) Example: .. code-block:: ring Load "gameengine.ring" # Give Control to the Game Engine func main # Called by the Game Engine oGame = New Game # Create the Game Object { title = "My First Game" text { x = 10 y=50 animate = false size = 20 file = "fonts/pirulen.ttf" text = "game development using ring is very fun!" color = rgb(0,0,0) # Color = black } text { x = 10 y=150 # Animation Part ====================================== animate = true # Use Animation direction = GE_DIRECTION_INCVERTICAL # Increase y point = 400 # Continue until y=400 nStep = 3 # Each time y+= 3 #====================================================== size = 20 file = "fonts/pirulen.ttf" text = "welcome to the real world!" color = rgb(0,0,255) # Color = Blue } Sound { # Play Sound file = "sound/music1.wav" # Sound File Name } } # Start the Events Loop See the "Demo Project - Game Engine for 2D Games" chapter. .. index:: pair: What is new in Ring 1.1?; RingSQLite RingSQLite ========== Ring 1.0 provided support for ODBC to use any database and provided native support for MySQL. Now Ring 1.1 provide native support for SQLite database too. Example: .. code-block:: ring oSQLite = sqlite_init() sqlite_open(oSQLite,"mytest.db") sql = "CREATE TABLE COMPANY(" + "ID INT PRIMARY KEY NOT NULL," + "NAME TEXT NOT NULL," + "AGE INT NOT NULL," + "ADDRESS CHAR(50)," + "SALARY REAL );" sqlite_execute(oSQLite,sql) sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " + "VALUES (1, 'Mahmoud', 29, 'Jeddah', 20000.00 ); " + "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " + "VALUES (2, 'Ahmed', 27, 'Jeddah', 15000.00 ); " + "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" + "VALUES (3, 'Mohammed', 31, 'Egypt', 20000.00 );" + "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" + "VALUES (4, 'Ibrahim', 24, 'Egypt ', 65000.00 );" sqlite_execute(oSQLite,sql) aResult = sqlite_execute(oSQLite,"select * from COMPANY") for x in aResult for t in x see t[2] + nl next next see copy("*",50) + nl for x in aResult see x["name"] + nl next sqlite_close(oSQLite) .. index:: pair: What is new in Ring 1.1?; Better Code Generator for Extensions Better Code Generator for Extensions ==================================== We are using the code generator (written in Ring) every day to add new libraries to Ring. The generator is used to create RingQt and RingAllegro Also in Ring 1.1 it's used to create RingLibSDL. more features are added like * Set/Get structure members (numbers & pointers) * Using constants * Better Generated Code See the Code Generator chapter. .. index:: pair: What is new in Ring 1.1?; Using Self.Attribute in the Class Region to define new attributes Using Self.Attribute in the Class Region to define new attributes ================================================================= We can use Self.Attribute in the Class Region (after the class name and before any methods) to define new attributes. .. code-block:: ring class Person name # Define name as attribute if it's not a global variable address phone class person2 self.name # Must Define the attribute self.address self.phone .. index:: pair: What is new in Ring 1.1?; Using This.Attribute in nested Braces inside the Class Methods Using This.Attribute in nested Braces inside the Class Methods ============================================================== We can use nested braces {} while we are inside methods to access another objects, In this case the current object scope will be changed while we are inside the brace and Self will point to the object that we access using braces {}. In this case we can use This.Attribute and This.Method() to access the object that will be created from the current class. Check the Object Oriented Programming chapter for more information. Also Check the Weight History Application in GUI Development using RingQt chapter. .. index:: pair: What is new in Ring 1.1?; Better Documentation Better Documentation ==================== Ring 1.1 documentation (800 pages) is better than Ring 1.0 documentation (340 pages) Many chapters are added for providing better information about the language like * Language Reference * Scope Rules * FAQ And more!