Skip to content

Commit

Permalink
copy slice, map
Browse files Browse the repository at this point in the history
  • Loading branch information
covrom committed Oct 1, 2017
1 parent 067689e commit 0adad9b
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 6 deletions.
35 changes: 35 additions & 0 deletions core/coremap.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import (
"errors"
"fmt"
"reflect"

"github.com/covrom/gonec/names"
)

type VMStringMap map[string]VMValuer
Expand Down Expand Up @@ -49,6 +51,39 @@ func (x VMStringMap) Hash() VMString {
return VMString(hex.EncodeToString(h))
}

func (x VMStringMap) MethodMember(name int) (VMFunc, bool) {

// только эти методы будут доступны из кода на языке Гонец!

switch names.UniqueNames.GetLowerCase(name) {
case "скопировать":
return VMFuncMustParams(0, x.Скопировать), true
}

return nil, false
}

func (x VMStringMap) CopyRecursive() VMStringMap {
rv := make(VMStringMap, len(x))
for k, v := range x {
switch vv := v.(type) {
case VMSlice:
rv[k]=vv.CopyRecursive()
case VMStringMap:
rv[k]=vv.CopyRecursive()
default:
rv[k]=v
}
}
return rv
}

func (x VMStringMap) Скопировать(args VMSlice, rets *VMSlice) error { //VMSlice {
rv := x.CopyRecursive()
rets.Append(rv)
return nil
}

func (x VMStringMap) EvalBinOp(op VMOperation, y VMOperationer) (VMValuer, error) {
switch op {
case ADD:
Expand Down
33 changes: 28 additions & 5 deletions core/coreslice.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,19 +69,19 @@ func (x VMSlice) SortDefault() {
sort.Sort(VMSliceUpSort(x))
}

func (t VMSlice) MethodMember(name int) (VMFunc, bool) {
func (x VMSlice) MethodMember(name int) (VMFunc, bool) {

// только эти методы будут доступны из кода на языке Гонец!

switch names.UniqueNames.GetLowerCase(name) {
case "сортировать":
return VMFuncMustParams(0, t.Сортировать), true
return VMFuncMustParams(0, x.Сортировать), true
case "сортироватьубыв":
return VMFuncMustParams(0, t.СортироватьУбыв), true
return VMFuncMustParams(0, x.СортироватьУбыв), true
case "обратить":
return VMFuncMustParams(0, t.Обратить), true
return VMFuncMustParams(0, x.Обратить), true
case "скопировать":
return VMFuncMustParams(0, t.Скопировать), true
return VMFuncMustParams(0, x.Скопировать), true
}

return nil, false
Expand All @@ -104,9 +104,32 @@ func (x VMSlice) Обратить(args VMSlice, rets *VMSlice) error {
return nil
}

func (x VMSlice) CopyRecursive() VMSlice {
rv := make(VMSlice, len(x))
for i, v := range x {
switch vv := v.(type) {
case VMSlice:
rv[i]=vv.CopyRecursive()
case VMStringMap:
rv[i]=vv.CopyRecursive()
default:
rv[i]=v
}
}
return rv
}

func (x VMSlice) Скопировать(args VMSlice, rets *VMSlice) error { //VMSlice {
rv := make(VMSlice, len(x))
copy(rv, x)
for i,v:=range rv{
switch vv := v.(type) {
case VMSlice:
rv[i]=vv.CopyRecursive()
case VMStringMap:
rv[i]=vv.CopyRecursive()
}
}
rets.Append(rv)
return nil
}
Expand Down
3 changes: 2 additions & 1 deletion main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,12 @@ func TestRun(t *testing.T) {
сообщить("Из json:",б.ВСтроку(), б.ПолеСтрока)
# массив с вложенным массивом со структурой и датой
а=[2, 1, [3, {"а":1}, Дата("2017-08-17T09:23:00+03:00")], 4]
а=[2, 1, [3, {"привет":2, "а":1}, Дата("2017-08-17T09:23:00+03:00")], 4]
а[2][1].а=Дата("2017-08-17T09:23:00+03:00")
# приведение массива или структуры к типу "строка" означает сериализацию в json, со всеми вложенными массивами и структурами
Сообщить(а, а[2][1].а)
Сообщить(Строка(а))
Сообщить("Ключи в порядке сортировки:", Ключи(а[2][1]))
# приведение строки к массиву или структуре означает десериализацию из json
Сообщить(Массив("[1,2,3.5,4]"))
Сообщить(Массив(Строка(а)))
Expand Down

0 comments on commit 0adad9b

Please sign in to comment.