Вы находитесь на странице: 1из 10

Ring Documentation, Release 1.5.

see "message from the test function!" + nl


class test

In the previous example we have a function called test() so we can call it directly using test()
In the next example, test() will become a method
See"Hello"
test() # runtime error message
class test
func test # Test() now is a method (not a function)
see "message from the test method!" + nl

The errors comes when you define a method then try calling it directly as a function.
The previous program must be
See"Hello"
new test { test() } # now will call the method
class test
func test # Test() now is a method (not a function)
see "message from the test method!" + nl

96.49 Can Ring work on Windows XP?

Ring can work on Windows XP and load extensions without problems.


Just be sure that the extension can work on Windows XP and your compiler version support that (modern compilers
requires some flags to support XP)
Check this topic https://blogs.msdn.microsoft.com/vcblog/2012/10/08/windows-xp-targeting-with-c-in-visual-studio-
2012/
For example, We added
/link /SUBSYSTEM:CONSOLE,"5.01"

To the batch file to support Windows XP


See : https://github.com/ring-lang/ring/blob/master/src/buildvccomplete.bat

96.50 How to extend RingQt and add more classes?

You have many options


In general you can extend Ring using C or C++ code
Ring from Ring code you can call C Functions or use C++ Classes & Methods
This chapter in the documentation explains this part in the language http://ring-
lang.sourceforge.net/doc/extension.html
For example the next code in .c file can be compiled to a DLL file using the Ring library (.lib)
#include "ring.h"

RING_FUNC(ring_ringlib_dlfunc)
{

96.49. Can Ring work on Windows XP? 1755


Ring Documentation, Release 1.5.3

printf("Message from dlfunc");


}

RING_API void ringlib_init(RingState *pRingState)


{
ring_vm_funcregister("dlfunc",ring_ringlib_dlfunc);
}

Then from Ring you can load the DLL file using LoadLib() function then call the C function that called dlfunc() as
any Ring function.
See "Dynamic DLL" + NL
LoadLib("ringlib.dll")
dlfunc()

Output
Dynamic DLL
Message from dlfunc

When you read the documentation you will know about how to get parameters like (strings, numbers, lists and objects)
And how to return a value (any type) from you function.
From experience, when we support a C library or C++ Library
We discovered that a lot of functions share a lot of code
To save our time, and to quickly generate wrappers for C/C++ Libraries to be used in Ring
We have this code generator
https://github.com/ring-lang/ring/blob/master/extensions/codegen/parsec.ring
The code generator is just a Ring program < 1200 lines of Ring code
The generator take as input a configuration file contains the C/C++ library information
like Functions Prototype, Classes and Methods, Constants, Enum, Structures and members , etc.
Then the generator will generate
*.C File for C libraries (to be able to use the library functions)
*.CPP File for C++ libraries (to be able to use C++ classes and methods)
*.Ring File (to be able to use C++ classes as Ring classes)
*.RH file (Constants)
To understand how the generator work check this extension for the Allegro game programming library
https://github.com/ring-lang/ring/tree/master/extensions/ringallegro
At first we have the configuration file
https://github.com/ring-lang/ring/blob/master/extensions/ringallegro/allegro.cf
To write this file, i just used the Allegro documentation + the Ring code generator rules
Then after executing the generator using this batch file
https://github.com/ring-lang/ring/blob/master/extensions/ringallegro/gencode.bat
or using this script
https://github.com/ring-lang/ring/blob/master/extensions/ringallegro/gencode.sh

96.50. How to extend RingQt and add more classes? 1756


Ring Documentation, Release 1.5.3

I get the generated source code file


https://github.com/ring-lang/ring/blob/master/extensions/ringallegro/ring_allegro.c
The generated source code file (ring_allegro.c) is around 12,000 Lines of code (12 KLOC)
While the configuration file is less than 1 KLOC
To build the library (create the DLL files)
https://github.com/ring-lang/ring/blob/master/extensions/ringallegro/buildvc.bat
Also you can check this extension for the LibSDL Library
https://github.com/ring-lang/ring/tree/master/extensions/ringsdl
After this know you should know about
1 - Writing the configuration file
2 - Using the Code Generator
3 - Building your library/extension
4 - Using your library/extension from Ring code
Let us move now to you question about Qt
We have RingQt which is just an extension to ring (ringqt.dll)
You don’t need to modify Ring.
1. You just need to modify RingQt
2. Or extend Ring with another extension based on Qt (but the same Qt version)
For the first option see the RingQt extension
https://github.com/ring-lang/ring/tree/master/extensions/ringqt
Configuration file
https://github.com/ring-lang/ring/blob/master/extensions/ringqt/qt.cf
To generate the source code
https://github.com/ring-lang/ring/blob/master/extensions/ringqt/gencode.bat
https://github.com/ring-lang/ring/blob/master/extensions/ringqt/gencode.sh
https://github.com/ring-lang/ring/blob/master/extensions/ringqt/gencodeandroid.bat
To build the DLL/so/Dylib files
https://github.com/ring-lang/ring/blob/master/extensions/ringqt/buildmingw32.bat
https://github.com/ring-lang/ring/blob/master/extensions/ringqt/buildgcc.sh
https://github.com/ring-lang/ring/blob/master/extensions/ringqt/buildclang.sh
Study RingQt
Learn about the options that you have
1. wrapping a Qt class directly
2. Creating a new class then wrapping your new class

96.50. How to extend RingQt and add more classes? 1757


Ring Documentation, Release 1.5.3

For the second option (in the previous two points or in the two points before that)
You will create new classes in C++ code
Then you merge these classes to RingQt or provide special DLL for them (your decision)
If your work is general (will help others) just put it to RingQt.
if your work is special (to specific application) just put it in another extension.

96.51 How to add Combobox and other elements to the cells of a


QTableWidget?

Check the next code


Load "guilib.ring"
New qApp
{
win1 = new qMainWindow() {
setGeometry(100,100,1100,370)
setwindowtitle("Using QTableWidget")

Table1 = new qTableWidget(win1) {


setrowcount(10) setcolumncount(10)
setGeometry(0,0,800,400)
setselectionbehavior(QAbstractItemView_SelectRows)

for x = 1 to 10
for y = 1 to 10
item1 = new qtablewidgetitem("R"+X+"C"+Y)
setitem(x-1,y-1, item1)
next
next

cmb = new QComboBox(Table1) {


alist = ["one","two","three","four","five"]
for x in aList additem(x,0) next
}
setCellWidget(5, 5, cmb)
}

setcentralwidget(table1)
show()
}
exec()
}

96.52 How to perform some manipulations on selected cells in


QTableWidget?

Check the next sample


Load "guilib.ring"

New qApp {

96.51. How to add Combobox and other elements to the cells of a QTableWidget? 1758
Ring Documentation, Release 1.5.3

win1 = new qMainWindow() {


setGeometry(100,100,800,600)
setwindowtitle("Using QTableWidget")
Table1 = new qTableWidget(win1) {
setrowcount(10) setcolumncount(10)
setGeometry(10,10,400,400)
for x = 1 to 10
for y = 1 to 10
item1 = new qtablewidgetitem("10")
setitem(x-1,y-1,item1)
next
next
}
btn1 = new qPushButton(win1) {
setText("Increase")
setGeometry(510,10,100,30)
setClickEvent("pClick()")
}
show()
}
exec()
}

func pClick
for nRow = 0 to Table1.rowcount() - 1
for nCol = 0 to Table1.columncount() - 1
Table1.item(nRow,nCol) {
if isSelected()
setText( "" + ( 10 + text()) )
ok
}
next
next

96.52. How to perform some manipulations on selected cells in QTableWidget? 1759


CHAPTER

NINETYSEVEN

LANGUAGE REFERENCE

In this chapter we will learn about


• Language keywords
• Language Functions
• Compiler Errors
• Runtime Errors
• Environment Errors
• Language Grammar
• Virtual Machine (VM) Instructions

97.1 Language Keywords

Keywords Count : 49
• again
• and
• but
• bye
• call
• case
• catch
• changeringkeyword
• changeringoperator
• class
• def
• do
• done
• else
• elseif
• end

1760
Ring Documentation, Release 1.5.3

• exit
• for
• from
• func
• get
• give
• if
• import
• in
• load
• loadsyntax
• loop
• new
• next
• not
• off
• ok
• on
• or
• other
• package
• private
• put
• return
• see
• step
• switch
• to
• try
• while
• endfunc
• endclass
• endpackage

97.1. Language Keywords 1761


Ring Documentation, Release 1.5.3

97.2 Language Functions

Functions Count : 197


len() add() del() sysget() clock() lower()
upper() input() ascii() char() date() time()
filename() getchar() system() random() timelist() adddays()
diffdays() version() clockspersecond() prevfilename() swap() shutdown()
isstring() isnumber() islist() type() isnull() isobject()
hex() dec() number() string() str2hex() hex2str()
str2list() list2str() left() right() trim() copy()
substr() lines() strcmp() eval() raise() assert()
isalnum() isalpha() iscntrl() isdigit() isgraph() islower()
isprint() ispunct() isspace() isupper() isxdigit() locals()
globals() functions() cfunctions() islocal() isglobal() isfunction()
iscfunction() packages() ispackage() classes() isclass() packageclasses()
ispackageclass() classname() objectid() attributes() methods() isattribute()
ismethod() isprivateattribute() isprivatemethod()
addattribute() addmethod() getattribute()
setattribute() mergemethods() packagename() ringvm_fileslist()
ringvm_calllist() ringvm_memorylist()
ringvm_functionslist() ringvm_classeslist() ringvm_packageslist()
ringvm_cfunctionslist() ringvm_settrace() ringvm_tracedata()
ringvm_traceevent() ringvm_tracefunc() ringvm_scopescount()
ringvm_evalinscope() ringvm_passerror() ringvm_hideerrormsg()
ringvm_callfunc() list() find() min() max() insert()
sort() reverse() binarysearch() sin() cos() tan()
asin() acos() atan() atan2() sinh() cosh()
tanh() exp() log() log10() ceil() floor()
fabs() pow() sqrt() unsigned() decimals() murmur3hash()
fopen() fclose() fflush() freopen() tempfile() tempname()
fseek() ftell() rewind() fgetpos() fsetpos() clearerr()
feof() ferror() perror() rename() remove() fgetc()
fgets() fputc() fputs() ungetc() fread() fwrite()
dir() read() write() fexists() int2bytes() float2bytes()
double2bytes() bytes2int() bytes2float()
bytes2double() ismsdos() iswindows()
iswindows64() isunix() ismacosx() islinux() isfreebsd() isandroid()
windowsnl() currentdir() exefilename() chdir() exefolder() loadlib()
closelib() callgc() varptr() intvalue() object2pointer() pointer2object()
nullpointer() space() ptrcmp() ring_state_init()
ring_state_runcode() ring_state_delete()
ring_state_runfile() ring_state_findvar() ring_state_newvar()
ring_state_runobjectfile()

97.3 Compiler Errors

• Error (C1) : Error in parameters list, expected identifier


• Error (C2) : Error in class name
• Error (C3) : Unclosed control strucutre, ‘ok’ is missing
• Error (C4) : Unclosed control strucutre, ‘end’ is missing
• Error (C5) : Unclosed control strucutre, next is missing
• Error (C6) : Error in function name

97.2. Language Functions 1762


Ring Documentation, Release 1.5.3

• Error (C7) : Error in list items


• Error (C8) : Parentheses ‘)’ is missing
• Error (C9) : Brackets ‘]’ is missing
• Error (C10) : Error in parent class name
• Error (C11) : Error in expression operator
• Error (C12) : No class definition
• Error (C13) : Error in variable name
• Error (C14) : Try/Catch miss the Catch keyword!
• Error (C15) : Try/Catch miss the Done keyword!
• Error (C16) : Error in Switch statement expression!
• Error (C17) : Switch statement without OFF
• Error (C18) : Missing closing brace for the block opened!
• Error (C19) : Numeric Overflow!
• Error (C20) : Error in package name
• Error (C21) : Unclosed control strucutre, ‘again’ is missing
• Error (C22) : Function redefinition, function is already defined!
• Error (C23) : Using ‘(‘ after number!
• Error (C24) : The parent class name is identical to the subclass name
• Error (C25) : Trying to access the self reference after the object name”
• Error (C26) : Class redefinition, class is already defined!

97.4 Runtime Errors

• Error (R1) : Cann’t divide by zero !


• Error (R2) : Array Access (Index out of range) !
• Error (R3) : Calling Function without definition !
• Error (R4) : Stack Overflow !
• Error (R5) : Can’t access the list item, Object is not list !
• Error (R6) : Variable is required
• Error (R7) : Can’t assign to a string letter more than one character
• Error (R8) : Variable is not a string
• Error (R9) : Using exit command outside loops
• Error (R10) : Using exit command with number outside the range
• Error (R11) : error in class name, class not found!
• Error (R12) : error in property name, property not found!
• Error (R13) : Object is required

97.4. Runtime Errors 1763


Ring Documentation, Release 1.5.3

• Error (R14) : Calling Method without definition !


• Error (R15) : error in parent class name, class not found!
• Error (R16) : Using braces to access unknown object !
• Error (R17) : error, using ‘Super’ without parent class!
• Error (R18) : Numeric Overflow!
• Error (R19) : Calling function with less number of parameters!
• Error (R20) : Calling function with extra number of parameters!
• Error (R21) : Using operator with values of incorrect type
• Error (R22) : Using loop command outside loops
• Error (R23) : Using loop command with number outside the range
• Error (R24) : Using uninitialized variable
• Error (R25) : Error in package name, Package not found!
• Error (R26) : Calling private method from outside the class
• Error (R27) : Using private attribute from outside the class
• Error (R28) : Using bad data type as step value
• Error (R29) : Using bad data type in for loop
• Error (R30) : parent class name is identical to child class name
• Error (R31) : Trying to destory the object using the self reference
• Error (R32) : The CALL command expect a variable contains string!
• Error (R33) : Bad decimals number (correct range >= 0 and <=14) !
• Error (R34) : Variable is required for the assignment operation
• Error (R35) : Can’t create/open the file!
• Error (R36) : The column number is not correct! It’s greater than the number of columns in the list
• Error (R37) : Sorry, The command is not supported in this context
• Error (R38) : Runtime Error in loading the dynamic library!

97.5 Environment Errors

• Error (E1) : Caught SegFault


• Error (E2) : Out of Memory
• Error (E3) : Deleting scope while no scope!
• Error (E4) : Long VM Instruction!

97.5. Environment Errors 1764