Skip to content

Commit 0adad9b

Browse files
committed
copy slice, map
1 parent 067689e commit 0adad9b

File tree

3 files changed

+65
-6
lines changed

3 files changed

+65
-6
lines changed

core/coremap.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import (
88
"errors"
99
"fmt"
1010
"reflect"
11+
12+
"github.com/covrom/gonec/names"
1113
)
1214

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

54+
func (x VMStringMap) MethodMember(name int) (VMFunc, bool) {
55+
56+
// только эти методы будут доступны из кода на языке Гонец!
57+
58+
switch names.UniqueNames.GetLowerCase(name) {
59+
case "скопировать":
60+
return VMFuncMustParams(0, x.Скопировать), true
61+
}
62+
63+
return nil, false
64+
}
65+
66+
func (x VMStringMap) CopyRecursive() VMStringMap {
67+
rv := make(VMStringMap, len(x))
68+
for k, v := range x {
69+
switch vv := v.(type) {
70+
case VMSlice:
71+
rv[k]=vv.CopyRecursive()
72+
case VMStringMap:
73+
rv[k]=vv.CopyRecursive()
74+
default:
75+
rv[k]=v
76+
}
77+
}
78+
return rv
79+
}
80+
81+
func (x VMStringMap) Скопировать(args VMSlice, rets *VMSlice) error { //VMSlice {
82+
rv := x.CopyRecursive()
83+
rets.Append(rv)
84+
return nil
85+
}
86+
5287
func (x VMStringMap) EvalBinOp(op VMOperation, y VMOperationer) (VMValuer, error) {
5388
switch op {
5489
case ADD:

core/coreslice.go

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,19 +69,19 @@ func (x VMSlice) SortDefault() {
6969
sort.Sort(VMSliceUpSort(x))
7070
}
7171

72-
func (t VMSlice) MethodMember(name int) (VMFunc, bool) {
72+
func (x VMSlice) MethodMember(name int) (VMFunc, bool) {
7373

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

7676
switch names.UniqueNames.GetLowerCase(name) {
7777
case "сортировать":
78-
return VMFuncMustParams(0, t.Сортировать), true
78+
return VMFuncMustParams(0, x.Сортировать), true
7979
case "сортироватьубыв":
80-
return VMFuncMustParams(0, t.СортироватьУбыв), true
80+
return VMFuncMustParams(0, x.СортироватьУбыв), true
8181
case "обратить":
82-
return VMFuncMustParams(0, t.Обратить), true
82+
return VMFuncMustParams(0, x.Обратить), true
8383
case "скопировать":
84-
return VMFuncMustParams(0, t.Скопировать), true
84+
return VMFuncMustParams(0, x.Скопировать), true
8585
}
8686

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

107+
func (x VMSlice) CopyRecursive() VMSlice {
108+
rv := make(VMSlice, len(x))
109+
for i, v := range x {
110+
switch vv := v.(type) {
111+
case VMSlice:
112+
rv[i]=vv.CopyRecursive()
113+
case VMStringMap:
114+
rv[i]=vv.CopyRecursive()
115+
default:
116+
rv[i]=v
117+
}
118+
}
119+
return rv
120+
}
121+
107122
func (x VMSlice) Скопировать(args VMSlice, rets *VMSlice) error { //VMSlice {
108123
rv := make(VMSlice, len(x))
109124
copy(rv, x)
125+
for i,v:=range rv{
126+
switch vv := v.(type) {
127+
case VMSlice:
128+
rv[i]=vv.CopyRecursive()
129+
case VMStringMap:
130+
rv[i]=vv.CopyRecursive()
131+
}
132+
}
110133
rets.Append(rv)
111134
return nil
112135
}

main_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,12 @@ func TestRun(t *testing.T) {
4343
сообщить("Из json:",б.ВСтроку(), б.ПолеСтрока)
4444
4545
# массив с вложенным массивом со структурой и датой
46-
а=[2, 1, [3, {"а":1}, Дата("2017-08-17T09:23:00+03:00")], 4]
46+
а=[2, 1, [3, {"привет":2, "а":1}, Дата("2017-08-17T09:23:00+03:00")], 4]
4747
а[2][1].а=Дата("2017-08-17T09:23:00+03:00")
4848
# приведение массива или структуры к типу "строка" означает сериализацию в json, со всеми вложенными массивами и структурами
4949
Сообщить(а, а[2][1].а)
5050
Сообщить(Строка(а))
51+
Сообщить("Ключи в порядке сортировки:", Ключи(а[2][1]))
5152
# приведение строки к массиву или структуре означает десериализацию из json
5253
Сообщить(Массив("[1,2,3.5,4]"))
5354
Сообщить(Массив(Строка(а)))

0 commit comments

Comments
 (0)