Skip to content

Commit e9a4021

Browse files
committed
duration
1 parent 0adad9b commit e9a4021

File tree

4 files changed

+110
-454
lines changed

4 files changed

+110
-454
lines changed

core/core.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,6 @@ func Import(env *Env) *Env {
143143
return errors.New("Должно быть число секунд (допустимо с дробной частью)")
144144
}))
145145

146-
// TODO: добавить операции по умножению длительностей VMTimeDuration на числа VMNumberer.Decimal
147-
148146
env.DefineS("длительностьнаносекунды", VMNanosecond)
149147
env.DefineS("длительностьмикросекунды", VMMicrosecond)
150148
env.DefineS("длительностьмиллисекунды", VMMillisecond)

core/coretime.go

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,113 @@ func fmtInt(buf []byte, v uint64) int {
157157
return w
158158
}
159159

160+
// EvalBinOp сравнивает два значения или выполняет бинарную операцию
161+
func (x VMTimeDuration) EvalBinOp(op VMOperation, y VMOperationer) (VMValuer, error) {
162+
switch op {
163+
case ADD:
164+
switch yy := y.(type) {
165+
case VMTimeDuration:
166+
return VMTimeDuration(int64(x) + int64(yy)), nil
167+
case VMTime:
168+
return yy.Add(x), nil
169+
}
170+
return VMNil, errors.New("Операция между значениями невозможна")
171+
case SUB:
172+
switch yy := y.(type) {
173+
case VMTimeDuration:
174+
return VMTimeDuration(int64(x) - int64(yy)), nil
175+
}
176+
return VMNil, errors.New("Операция между значениями невозможна")
177+
case MUL:
178+
switch yy := y.(type) {
179+
case VMInt:
180+
return VMTimeDuration(int64(x) * int64(yy)), nil
181+
case VMDecimal:
182+
return VMTimeDuration(yy.Mul(NewVMDecimalFromInt64(int64(x))).Int()), nil
183+
case VMTimeDuration:
184+
return VMTimeDuration(int64(x) * int64(yy)), nil
185+
}
186+
return VMNil, errors.New("Операция между значениями невозможна")
187+
case QUO:
188+
switch yy := y.(type) {
189+
case VMTimeDuration:
190+
return VMTimeDuration(int64(x) / int64(yy)), nil
191+
}
192+
return VMNil, errors.New("Операция между значениями невозможна")
193+
case REM:
194+
switch yy := y.(type) {
195+
case VMTimeDuration:
196+
return VMTimeDuration(int64(x) % int64(yy)), nil
197+
}
198+
return VMNil, errors.New("Операция между значениями невозможна")
199+
case EQL:
200+
switch yy := y.(type) {
201+
case VMTimeDuration:
202+
return VMBool(int64(x) == int64(yy)), nil
203+
}
204+
return VMNil, errors.New("Операция между значениями невозможна")
205+
case NEQ:
206+
switch yy := y.(type) {
207+
case VMTimeDuration:
208+
return VMBool(int64(x) != int64(yy)), nil
209+
}
210+
return VMNil, errors.New("Операция между значениями невозможна")
211+
case GTR:
212+
switch yy := y.(type) {
213+
case VMTimeDuration:
214+
return VMBool(int64(x) > int64(yy)), nil
215+
}
216+
return VMNil, errors.New("Операция между значениями невозможна")
217+
case GEQ:
218+
switch yy := y.(type) {
219+
case VMTimeDuration:
220+
return VMBool(int64(x) >= int64(yy)), nil
221+
}
222+
return VMNil, errors.New("Операция между значениями невозможна")
223+
case LSS:
224+
switch yy := y.(type) {
225+
case VMTimeDuration:
226+
return VMBool(int64(x) < int64(yy)), nil
227+
}
228+
return VMNil, errors.New("Операция между значениями невозможна")
229+
case LEQ:
230+
switch yy := y.(type) {
231+
case VMTimeDuration:
232+
return VMBool(int64(x) <= int64(yy)), nil
233+
}
234+
return VMNil, errors.New("Операция между значениями невозможна")
235+
case OR:
236+
return VMNil, errors.New("Операция между значениями невозможна")
237+
case LOR:
238+
return VMNil, errors.New("Операция между значениями невозможна")
239+
case AND:
240+
return VMNil, errors.New("Операция между значениями невозможна")
241+
case LAND:
242+
return VMNil, errors.New("Операция между значениями невозможна")
243+
case POW:
244+
return VMNil, errors.New("Операция между значениями невозможна")
245+
case SHR:
246+
return VMNil, errors.New("Операция между значениями невозможна")
247+
case SHL:
248+
return VMNil, errors.New("Операция между значениями невозможна")
249+
}
250+
return VMNil, errors.New("Неизвестная операция")
251+
}
252+
253+
func (x VMTimeDuration) ConvertToType(nt reflect.Type) (VMValuer, error) {
254+
switch nt {
255+
case ReflectVMString:
256+
return VMString(x.String()), nil
257+
case ReflectVMInt:
258+
return VMInt(int64(x)), nil
259+
case ReflectVMTimeDuration:
260+
return x, nil
261+
case ReflectVMDecimal:
262+
return NewVMDecimalFromInt64(int64(x)), nil
263+
}
264+
return VMNil, errors.New("Приведение к типу невозможно")
265+
}
266+
160267
func (x VMTimeDuration) MarshalBinary() ([]byte, error) {
161268
var buf bytes.Buffer
162269
binary.Write(&buf, binary.LittleEndian, int64(x))

main_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,10 @@ func TestRun(t *testing.T) {
4444
4545
# массив с вложенным массивом со структурой и датой
4646
а=[2, 1, [3, {"привет":2, "а":1}, Дата("2017-08-17T09:23:00+03:00")], 4]
47-
а[2][1].а=Дата("2017-08-17T09:23:00+03:00")
47+
Сообщить("Исходное:", а, а[2][1].а)
48+
а[2][1].а=Дата("2017-08-17T09:23:00+03:00")+ДлительностьДня*5
4849
# приведение массива или структуры к типу "строка" означает сериализацию в json, со всеми вложенными массивами и структурами
49-
Сообщить(а, а[2][1].а)
50+
Сообщить("Измененное:", а, а[2][1].а)
5051
Сообщить(Строка(а))
5152
Сообщить("Ключи в порядке сортировки:", Ключи(а[2][1]))
5253
# приведение строки к массиву или структуре означает десериализацию из json

0 commit comments

Comments
 (0)