Вверх ↑
Главный модератор
Ответов: 2999
Рейтинг: 396
#1: 2013-04-16 13:18:37 ЛС | профиль | цитата
Типизация данных на основе кодогенератора RTCG, позволяет "вставлять" код приведения типов данных, "пришедших" в компонент, и устанавливать для кодогенератора тип для данных, "уходящих" из него. Как это реализовано?
Для начала разработчик определяет используемые в пакете типы:
hiSys.hws

#hws
...
// register own types
register(1, int)
register(2, str)
...
затем, определяет правила преобразования типов друг в друга:
hiSys.hws

#hws
...
func to_type(value, type)
if(type == 1)
return(to_int(value))
elseif(type == 2)
return(to_str(value))
end
return(value)
end
...
наконец, разработчик реализует описанные правила:
hiSys.hws

#hws
...
func to_str(value)
t = code_type(value)
if(t == 1)
return('(' + value + ').ToString()')
end
return(value)
end

func to_int(value)
t = code_type(value)
if(t == 2)
return('Int32.Parse(' + value + ')')
end
return(value)
end
...
Теперь рассмотрим как это работает на уровне компонента. Если тип данных, принимаемых точкой, указан в INI файле компонента:
ini

#ini
[Methods]
...
data=Defines the data. ARG(string)|4|2
...
, то достаточно принять данные, используя лексему кодогенератора d(value), которая вызовет функцию sys.to_type(value, type), используя значение типа точки из INI файла:
hws

#hws
...
func doValue(data)
blk.println(this.codename, ' = ', d("data"), ';')
event("onValue", this.codename)
end
...
Если надо указать кодогенератору тип данных, "покидающих" компонент и заранее неуказанный в INI файле компонента, то используется лексема кодогенератора sub(value, type_id):
hws

#hws
...
func Var
return(sub(data, type_id))
end
...
, где type_id- код типа, определенный в файле hiSys.hws лексемой register(type_id, typename)
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0