Sie sind auf Seite 1von 10

Ring Documentation, Release 1.5.

# 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 and=0

ChangeRingKeyword _and and

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
if nWindowTitle = 0
nWindowTitle++
ok

func settitle cValue


if nWindowTitle = 1
nWindowTitle=0
see "Instruction : Window Title = " + cValue + nl
ok

func getand
see "Using : and" + nl

Output:
Instruction : I want window
Using : and
Instruction : Window Title = hello world

45.4 Change the Ring Operator ‘+’

What if we want to define a new behavior for any operator like the “+” operator.
We can do this change using the ChangeRingOperator command to hide operator (change it’s name)
Then we can use the operator as identifier that we can handle it’s behaviour
Syntax:

45.4. Change the Ring Operator ‘+’ 345


Ring Documentation, Release 1.5.2

ChangeRingOperator <oldoperator> <newoperator>

Note: remember to restore the operator again

Tip: The ChangeRingOperator command is executed in the scanner stage by the compiler (before parsing).

Example:
ChangeRingOperator + _+

New App {
+
}

Class App
+
func get+
see "Plus operator"

ChangeRingOperator _+ +

Output:
Plus operator

45.5 Change the ‘=’ operator to ‘is’

Example:
ChangeRingKeyword and _and
ChangeRingOperator = is

New App
{
I want window and the window title is "hello world"
}

ChangeRingOperator is =

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 and=0

ChangeRingKeyword _and and

func geti
if nIwantwindow = 0

45.5. Change the ‘=’ operator to ‘is’ 346


Ring Documentation, Release 1.5.2

nIwantwindow++
ok

func getwant
if nIwantwindow = 1
nIwantwindow++
ok

func getwindow
if nIwantwindow = 2
nIwantwindow= 0
see "Instruction : I want window" + nl
ok
if nWindowTitle = 0
nWindowTitle++
ok

func settitle cValue


if nWindowTitle = 1
nWindowTitle=0
see "Instruction : Window Title = " + cValue + nl
ok

45.6 Using Eval() with our Natural Code

Example:
func Main

cProgram = ' I want window and the window title is "hello world" '

MyLanguage(cProgram)

Func MyLanguage cCode

# We add to the code the instructions that change keywords and operators
# Because Eval() uses a new Compiler Object (the original keywords and operatos).

cCode = '
ChangeRingKeyword and _and
ChangeRingOperator = is
' + cCode

New App
{
eval(cCode)
}

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

45.6. Using Eval() with our Natural Code 347


Ring Documentation, Release 1.5.2

title
nWindowTitle = 0
# Keywords to ignore, just give them any value
the=0

ChangeRingKeyword and _and


and=0
ChangeRingKeyword _and and

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
if nWindowTitle = 0
nWindowTitle++
ok

func settitle cValue


if nWindowTitle = 1
nWindowTitle=0
see "Instruction : Window Title = " + cValue + nl
ok

45.7 BraceStart and BraceEnd Methods

We can write code that will be executed before/after using { }


Example:
o1 = new test {
see "Hello" + nl
}

o1 {}

class test

func bracestart
see "start" + nl

func braceend
see "end" + nl

Output:

45.7. BraceStart and BraceEnd Methods 348


Ring Documentation, Release 1.5.2

start
Hello
end
start
end

45.8 BraceExprEval Method

The next example demonstrates how to use the “BraceExprEval” method to get expressions in Natural code.
Example:
new natural {
create 5
}

class natural
create=0
lkeyword = false
func braceexpreval r
if lkeyword lkeyword=false return ok
see "expr eval" + nl
see "type: " + type(r) see nl
see "value : " see r see nl
func getcreate
lkeyword = true
see "create" + nl

Output:
create
expr eval
type: NUMBER
value : 5

45.9 Real Natural Code

The next example is a more advanced example


# 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

45.8. BraceExprEval Method 349


Ring Documentation, Release 1.5.2

aNumbers + nNumber
next
func getsum
nSUm = 0
for x in aNumbers nSum+= x next
see "The Sum : " + nSum
private
value=0 aNumbers=[]

Output:
Enter Number (1) :3
Enter Number (2) :4
The Sum : 7

45.10 BraceError() Method

The next examples demonstrates how to use the “BraceError” method to handle errors when accessing the object using
braces {}.
Example:
func main
o1 = new point {
x=10 y=20 z=30
TEST
SEE test
}

class point x y z
func braceerror
see "Handle Error!" + nl
SEE "Message :" + cCatchError + nl
if ( left(cCatchError,11) = "Error (R24)" ) and not isattribute(self,"test")
see "add attribute" + nl
addattribute(self,"test")
test = 10
ok
see "done" + nl
return

Output:
Handle Error!
Message :Error (R24) : Using uninitialized variable : test
add attribute
done
10

Example:
new point {
x=10 y=20 z=30
test()
see "mmm..." + NL
}

45.10. BraceError() Method 350


Ring Documentation, Release 1.5.2

class point x y z
func braceerror
see "Handle Error!" + nl
see "Message :" + cCatchError + nl
see self
see "Done" + NL

Output:
Handle Error!
Message :Error (R3) : Calling Function without definition !: test
x: 10.000000
y: 20.000000
z: 30.000000
Done
mmm...

45.11 Clean Natural Code

Instead of typing the literal as “literal” we can accept the words directly.
Example:
The next example accept hello world instead of “hello world”
But this example uses braceend() to check the end of the instruction
This means that this class process only one natural statement that end with literal.
ChangeRingKeyword and _and

New App
{
I want window and the window title is 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 is
nWindowTitle = 0
# Keywords to ignore, just give them any value
the=0 and=0
# Data
literal = ""

ChangeRingKeyword _and and

func geti
if nIwantwindow = 0
nIwantwindow++
ok

func getwant

45.11. Clean Natural Code 351


Ring Documentation, Release 1.5.2

if nIwantwindow = 1
nIwantwindow++
ok

func getwindow
if nIwantwindow = 2
nIwantwindow= 0
see "Instruction : I want window" + nl
ok
if nWindowTitle = 0
nWindowTitle++
ok

func gettitle
if nWindowTitle = 1
nWindowTitle=2
ok

func getis
if nWindowTitle = 2
nWindowTitle=3
ok

func braceend
if nWindowTitle = 3
see "Instruction : Window Title = " + literal + nl
nWindowTitle = 0
ok

func braceerror
c= substr(cCatchError,":")
while c > 0
c= substr(cCatchError,":")
cCatchError=substr(cCatchError,c+1)
end
literal += substr(cCatchError,1)

45.11. Clean Natural Code 352


CHAPTER

FORTYSIX

USING THE NATURAL LIBRARY

In this chapter we will learn how to use the Natural Library to quickly define a language that contains a group of
commands.
To start using the library, We need to call naturallib.ring
load "naturallib.ring"

After loading the library, We can use the NaturalLanguage class that contains the next methods :-
• SetLanguageName(cLanguageName)
• setCommandsPath(cFolder)
• SetPackageName(cPackageName)
• UseCommand(cCommandName)
• SetOperators(cOperators)
• RunFile(cFileName)
• RunString(cString)

46.1 Natural Library - Demo Program

We will write the natural code in a Text file, for example program.txt
File: program.txt
Welcome to the Ring programming language!
What you are reading now is not comments, I swear!

After many years of programming I decided to think different about


programming and solve the problems in a better way.

We are writing commands or code and the Ring language is reading


it to understand us! Sure, What you are seeing now is
just ***part of the code - Not the Complete Program***
You have to write little things before and after this
part to be able to run it!

It is the natural part of our code where we can write in English,


Arabic or any Natural Language Then we will tell the computer
through the Ring language what must happens! in a way that we can scale
for large frameworks and programs.

353
Ring Documentation, Release 1.5.2

Just imagine what will happens to the world of programming once


we create many powerful frameworks using the Ring language that
uses this way (Natural Programming).

For example When we say Hello to the Machine, It can reply! and when we
say count from 1 to 5 it will understand us, Also if
we said count from 5 to 1 it will
understand us too! You can see the Output window!

This Goal is not new, but the Ring language comes


with an innovative solution to this problem.

Output:
Hello, Sir!

The Numbers!

I will count Again!

To execute the natural code, We have start.ring


In start.ring we define the language and the commands.
File: start.ring
load "stdlib.ring"
load "naturallib.ring"

New NaturalLanguage {
SetLanguageName(:MyLanguage)
SetCommandsPath(CurrentDir()+"/../command")
SetPackageName("MyLanguage.Natural")
UseCommand(:Hello)
UseCommand(:Count)
RunFile("program.txt")
}

We defined a language called MyLanguage, We have folder for the language commands.

46.1. Natural Library - Demo Program 354

Das könnte Ihnen auch gefallen