- Joined
- Sep 19, 2011
- Messages
- 527
hi, i'm trying to rebuild vjass from scratch using antlr4 (nothing serious, just for fun) and i thought that it would be cool to be able to return arrays from functions, so you can write something like:
and it will be translated to:
is it a good way to handle it?
greetings.
JASS:
struct test
private static method lower takes nothing returns integer array
local integer array e
e[0] = 4
e[1] = 5
e[2] = 6
e[3] = 7
e[4] = 8
return e
endmethod
private static method higher takes nothing returns integer array
local integer array e
e[0] = 4
e[1] = 5
e[2] = 6
e[3] = 7
e[4] = 8
e[5] = 9
e[6] = 10
e[7] = 11
return e
endmethod
private static method onInit takes nothing returns nothing
local integer array a = thistype.lower()
local integer array b = thistype.higher()
local integer i
set i = 0
loop
exitwhen a[i] == 0
call BJDebugMsg("a[" + I2S(i) + "] = " + I2S(a[i]))
set i = i + 1
endloop
call BJDebugMsg("--------------------------------")
set i = 0
loop
exitwhen b[i] == 0
call BJDebugMsg("b[" + I2S(i) + "] = " + I2S(b[i]))
set i = i + 1
endloop
endmethod
endstruct
and it will be translated to:
JASS:
globals
integer array integer_r
integer integer_r_last_index = 0
// only one array for each variable type
// unit array unit_r
// real array real_r
// ...
endglobals
// only one of these for each variable type
function reset_integer_r takes nothing returns nothing
loop
set integer_r[integer_r_last_index] = 0
exitwhen integer_r_last_index == 0
set integer_r_last_index = integer_r_last_index - 1
endloop
endfunction
// only one of these for each variable type
function set_integer_r takes integer index, integer value returns nothing
if (index < 0) then
// throw error -> thanks icemanbo
endif
if (index > integer_r_size) then
set integer_r_size = index
endif
set integer_r[index] = value
endfunction
struct test
private static method lower takes nothing returns nothing
call reset_integer_r()
call set_integer_r(0, 4)
call set_integer_r(1, 5)
call set_integer_r(2, 6)
call set_integer_r(3, 7)
call set_integer_r(4, 8)
endmethod
private static method higher takes nothing returns nothing
call reset_integer_r()
call set_integer_r(0, 4)
call set_integer_r(1, 5)
call set_integer_r(2, 6)
call set_integer_r(3, 7)
call set_integer_r(4, 8)
call set_integer_r(5, 9)
call set_integer_r(6, 10)
call set_integer_r(7, 11)
endmethod
private static method onInit takes nothing returns nothing
local integer array a
local integer array b
local integer i
call thistype.higher()
set i = integer_r_last_index
loop
set a[i] = integer_r[i]
exitwhen i == 0
set i = i - 1
endloop
call thistype.lower()
set i = integer_r_last_index
loop
set b[i] = integer_r[i]
exitwhen i == 0
set i = i - 1
endloop
set i = 0
loop
exitwhen a[i] == 0
call BJDebugMsg("a[" + I2S(i) + "] = " + I2S(a[i]))
set i = i + 1
endloop
call BJDebugMsg("--------------------------------")
set i = 0
loop
exitwhen b[i] == 0
call BJDebugMsg("b[" + I2S(i) + "] = " + I2S(b[i]))
set i = i + 1
endloop
endmethod
endstruct
is it a good way to handle it?
greetings.
Last edited: