parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Ответ

Sumo 19.02.2016 18:01 / 19.02.2016 18:17

С точки зрения класса date твой пример надо переписать так:
@main[]
$h[$.a(1)]
^h.a.inc[]
[$h.a]

$t[^test::create[]]
^t.a.inc[]
[$t.a]


@CLASS
test

@create[]
  $self._a(1)

@GET_a[]
  $result($self._a)

@SET_a[value]
  $self._a($value)
В коде Парсера геттер написан так:
override Value* VDate::get_element(const String& aname) {
	// $method
	if(Value* result=VStateless_object::get_element(aname))
		return result;

	// $TZ
	if(aname=="TZ")
		return ftz_cstr ? new VString(*new String(ftz_cstr)): new VString();

	int result;
	if(aname=="year") result=1900+ftm.tm_year;
	else if(aname=="month") result=1+ftm.tm_mon;
	else if(aname=="day") result=ftm.tm_mday;
	else if(aname=="hour") result=ftm.tm_hour;
	else if(aname=="minute") result=ftm.tm_min;
	else if(aname=="second") result=ftm.tm_sec;
	else if(aname=="weekday") result=ftm.tm_wday;
	else if(aname=="yearday") result=ftm.tm_yday;
	else if(aname=="daylightsaving") result=ftm.tm_isdst;
	else if(aname=="week") {
		yw week = CalcWeek(ftm);
		result=week.week;
	}
	else if(aname=="weekyear") {
		yw week = CalcWeek(ftm);
		result=1900+week.year;
	} else { return bark("%s field not found", &aname); }
	return new VInt(result);
}
Т.е. в объекте date лежит структура (ftm) из «сишных интов», поля которой преобразуются в парсеровский int (VInt) при каждом обращении к свойтсву.

p.s. В этом месте становится печально, что в парсере int мутабельный. Лучше бы иметь неизменяемые скаляры и строки, чтобы в принципе таких неоднозначностей не возникало. :)