diff options
author | Li Jin <dragon-fly@qq.com> | 2025-06-04 16:07:06 +0800 |
---|---|---|
committer | Li Jin <dragon-fly@qq.com> | 2025-06-04 16:07:06 +0800 |
commit | 0e72454a11f65d9ac800dedb698ddfcc15933785 (patch) | |
tree | 6cded6335c22c4dd204f7d3bc66efa0f76a41ef0 | |
parent | 548ab1d9ff5b831050f14f1355a3314a41163ad6 (diff) | |
download | yuescript-0e72454a11f65d9ac800dedb698ddfcc15933785.tar.gz yuescript-0e72454a11f65d9ac800dedb698ddfcc15933785.tar.bz2 yuescript-0e72454a11f65d9ac800dedb698ddfcc15933785.zip |
Added more reversed index support for slice. [skip CI]
-rw-r--r-- | spec/outputs/codes_from_doc.lua | 24 | ||||
-rw-r--r-- | spec/outputs/codes_from_doc_zh.lua | 24 | ||||
-rw-r--r-- | spec/outputs/comprehension.lua | 10 | ||||
-rw-r--r-- | spec/outputs/destructure.lua | 12 | ||||
-rw-r--r-- | spec/outputs/lists.lua | 43 | ||||
-rw-r--r-- | spec/outputs/switch.lua | 4 | ||||
-rw-r--r-- | spec/outputs/unicode/comprehension.lua | 10 | ||||
-rw-r--r-- | spec/outputs/unicode/lists.lua | 23 | ||||
-rw-r--r-- | src/yuescript/yue_compiler.cpp | 91 |
9 files changed, 174 insertions, 67 deletions
diff --git a/spec/outputs/codes_from_doc.lua b/spec/outputs/codes_from_doc.lua index b8dd9b7..e137823 100644 --- a/spec/outputs/codes_from_doc.lua +++ b/spec/outputs/codes_from_doc.lua | |||
@@ -1062,8 +1062,7 @@ local slice | |||
1062 | local _accum_0 = { } | 1062 | local _accum_0 = { } |
1063 | local _len_0 = 1 | 1063 | local _len_0 = 1 |
1064 | local _list_0 = items | 1064 | local _list_0 = items |
1065 | local _max_0 = 5 | 1065 | for _index_0 = 1, 5 do |
1066 | for _index_0 = 1, _max_0 < 0 and #_list_0 + _max_0 + 1 or _max_0 do | ||
1067 | local item = _list_0[_index_0] | 1066 | local item = _list_0[_index_0] |
1068 | _accum_0[_len_0] = item | 1067 | _accum_0[_len_0] = item |
1069 | _len_0 = _len_0 + 1 | 1068 | _len_0 = _len_0 + 1 |
@@ -1073,7 +1072,8 @@ local slice | |||
1073 | local _accum_0 = { } | 1072 | local _accum_0 = { } |
1074 | local _len_0 = 1 | 1073 | local _len_0 = 1 |
1075 | local _list_0 = items | 1074 | local _list_0 = items |
1076 | for _index_0 = 2, #_list_0 do | 1075 | local _max_0 = #_list_0 |
1076 | for _index_0 = 2, _max_0 do | ||
1077 | local item = _list_0[_index_0] | 1077 | local item = _list_0[_index_0] |
1078 | _accum_0[_len_0] = item | 1078 | _accum_0[_len_0] = item |
1079 | _len_0 = _len_0 + 1 | 1079 | _len_0 = _len_0 + 1 |
@@ -1083,7 +1083,8 @@ local slice | |||
1083 | local _accum_0 = { } | 1083 | local _accum_0 = { } |
1084 | local _len_0 = 1 | 1084 | local _len_0 = 1 |
1085 | local _list_0 = items | 1085 | local _list_0 = items |
1086 | for _index_0 = 1, #_list_0, 2 do | 1086 | local _max_0 = #_list_0 |
1087 | for _index_0 = 1, _max_0, 2 do | ||
1087 | local item = _list_0[_index_0] | 1088 | local item = _list_0[_index_0] |
1088 | _accum_0[_len_0] = item | 1089 | _accum_0[_len_0] = item |
1089 | _len_0 = _len_0 + 1 | 1090 | _len_0 = _len_0 + 1 |
@@ -1099,8 +1100,7 @@ for key, value in pairs(object) do | |||
1099 | print(key, value) | 1100 | print(key, value) |
1100 | end | 1101 | end |
1101 | local _list_0 = items | 1102 | local _list_0 = items |
1102 | local _max_0 = 4 | 1103 | for _index_0 = 2, 4 do |
1103 | for _index_0 = 2, _max_0 < 0 and #_list_0 + _max_0 + 1 or _max_0 do | ||
1104 | local item = _list_0[_index_0] | 1104 | local item = _list_0[_index_0] |
1105 | print(item) | 1105 | print(item) |
1106 | end | 1106 | end |
@@ -3332,8 +3332,7 @@ local slice | |||
3332 | local _accum_0 = { } | 3332 | local _accum_0 = { } |
3333 | local _len_0 = 1 | 3333 | local _len_0 = 1 |
3334 | local _list_0 = items | 3334 | local _list_0 = items |
3335 | local _max_0 = 5 | 3335 | for _index_0 = 1, 5 do |
3336 | for _index_0 = 1, _max_0 < 0 and #_list_0 + _max_0 + 1 or _max_0 do | ||
3337 | local item = _list_0[_index_0] | 3336 | local item = _list_0[_index_0] |
3338 | _accum_0[_len_0] = item | 3337 | _accum_0[_len_0] = item |
3339 | _len_0 = _len_0 + 1 | 3338 | _len_0 = _len_0 + 1 |
@@ -3343,7 +3342,8 @@ local slice | |||
3343 | local _accum_0 = { } | 3342 | local _accum_0 = { } |
3344 | local _len_0 = 1 | 3343 | local _len_0 = 1 |
3345 | local _list_0 = items | 3344 | local _list_0 = items |
3346 | for _index_0 = 2, #_list_0 do | 3345 | local _max_0 = #_list_0 |
3346 | for _index_0 = 2, _max_0 do | ||
3347 | local item = _list_0[_index_0] | 3347 | local item = _list_0[_index_0] |
3348 | _accum_0[_len_0] = item | 3348 | _accum_0[_len_0] = item |
3349 | _len_0 = _len_0 + 1 | 3349 | _len_0 = _len_0 + 1 |
@@ -3353,7 +3353,8 @@ local slice | |||
3353 | local _accum_0 = { } | 3353 | local _accum_0 = { } |
3354 | local _len_0 = 1 | 3354 | local _len_0 = 1 |
3355 | local _list_0 = items | 3355 | local _list_0 = items |
3356 | for _index_0 = 1, #_list_0, 2 do | 3356 | local _max_0 = #_list_0 |
3357 | for _index_0 = 1, _max_0, 2 do | ||
3357 | local item = _list_0[_index_0] | 3358 | local item = _list_0[_index_0] |
3358 | _accum_0[_len_0] = item | 3359 | _accum_0[_len_0] = item |
3359 | _len_0 = _len_0 + 1 | 3360 | _len_0 = _len_0 + 1 |
@@ -3369,8 +3370,7 @@ for key, value in pairs(object) do | |||
3369 | print(key, value) | 3370 | print(key, value) |
3370 | end | 3371 | end |
3371 | local _list_0 = items | 3372 | local _list_0 = items |
3372 | local _max_0 = 4 | 3373 | for _index_0 = 2, 4 do |
3373 | for _index_0 = 2, _max_0 < 0 and #_list_0 + _max_0 + 1 or _max_0 do | ||
3374 | local item = _list_0[_index_0] | 3374 | local item = _list_0[_index_0] |
3375 | print(item) | 3375 | print(item) |
3376 | end | 3376 | end |
diff --git a/spec/outputs/codes_from_doc_zh.lua b/spec/outputs/codes_from_doc_zh.lua index 80644a5..c6ba43d 100644 --- a/spec/outputs/codes_from_doc_zh.lua +++ b/spec/outputs/codes_from_doc_zh.lua | |||
@@ -1056,8 +1056,7 @@ local slice | |||
1056 | local _accum_0 = { } | 1056 | local _accum_0 = { } |
1057 | local _len_0 = 1 | 1057 | local _len_0 = 1 |
1058 | local _list_0 = items | 1058 | local _list_0 = items |
1059 | local _max_0 = 5 | 1059 | for _index_0 = 1, 5 do |
1060 | for _index_0 = 1, _max_0 < 0 and #_list_0 + _max_0 + 1 or _max_0 do | ||
1061 | local item = _list_0[_index_0] | 1060 | local item = _list_0[_index_0] |
1062 | _accum_0[_len_0] = item | 1061 | _accum_0[_len_0] = item |
1063 | _len_0 = _len_0 + 1 | 1062 | _len_0 = _len_0 + 1 |
@@ -1067,7 +1066,8 @@ local slice | |||
1067 | local _accum_0 = { } | 1066 | local _accum_0 = { } |
1068 | local _len_0 = 1 | 1067 | local _len_0 = 1 |
1069 | local _list_0 = items | 1068 | local _list_0 = items |
1070 | for _index_0 = 2, #_list_0 do | 1069 | local _max_0 = #_list_0 |
1070 | for _index_0 = 2, _max_0 do | ||
1071 | local item = _list_0[_index_0] | 1071 | local item = _list_0[_index_0] |
1072 | _accum_0[_len_0] = item | 1072 | _accum_0[_len_0] = item |
1073 | _len_0 = _len_0 + 1 | 1073 | _len_0 = _len_0 + 1 |
@@ -1077,7 +1077,8 @@ local slice | |||
1077 | local _accum_0 = { } | 1077 | local _accum_0 = { } |
1078 | local _len_0 = 1 | 1078 | local _len_0 = 1 |
1079 | local _list_0 = items | 1079 | local _list_0 = items |
1080 | for _index_0 = 1, #_list_0, 2 do | 1080 | local _max_0 = #_list_0 |
1081 | for _index_0 = 1, _max_0, 2 do | ||
1081 | local item = _list_0[_index_0] | 1082 | local item = _list_0[_index_0] |
1082 | _accum_0[_len_0] = item | 1083 | _accum_0[_len_0] = item |
1083 | _len_0 = _len_0 + 1 | 1084 | _len_0 = _len_0 + 1 |
@@ -1093,8 +1094,7 @@ for key, value in pairs(object) do | |||
1093 | print(key, value) | 1094 | print(key, value) |
1094 | end | 1095 | end |
1095 | local _list_0 = items | 1096 | local _list_0 = items |
1096 | local _max_0 = 4 | 1097 | for _index_0 = 2, 4 do |
1097 | for _index_0 = 2, _max_0 < 0 and #_list_0 + _max_0 + 1 or _max_0 do | ||
1098 | local item = _list_0[_index_0] | 1098 | local item = _list_0[_index_0] |
1099 | print(item) | 1099 | print(item) |
1100 | end | 1100 | end |
@@ -3320,8 +3320,7 @@ local slice | |||
3320 | local _accum_0 = { } | 3320 | local _accum_0 = { } |
3321 | local _len_0 = 1 | 3321 | local _len_0 = 1 |
3322 | local _list_0 = items | 3322 | local _list_0 = items |
3323 | local _max_0 = 5 | 3323 | for _index_0 = 1, 5 do |
3324 | for _index_0 = 1, _max_0 < 0 and #_list_0 + _max_0 + 1 or _max_0 do | ||
3325 | local item = _list_0[_index_0] | 3324 | local item = _list_0[_index_0] |
3326 | _accum_0[_len_0] = item | 3325 | _accum_0[_len_0] = item |
3327 | _len_0 = _len_0 + 1 | 3326 | _len_0 = _len_0 + 1 |
@@ -3331,7 +3330,8 @@ local slice | |||
3331 | local _accum_0 = { } | 3330 | local _accum_0 = { } |
3332 | local _len_0 = 1 | 3331 | local _len_0 = 1 |
3333 | local _list_0 = items | 3332 | local _list_0 = items |
3334 | for _index_0 = 2, #_list_0 do | 3333 | local _max_0 = #_list_0 |
3334 | for _index_0 = 2, _max_0 do | ||
3335 | local item = _list_0[_index_0] | 3335 | local item = _list_0[_index_0] |
3336 | _accum_0[_len_0] = item | 3336 | _accum_0[_len_0] = item |
3337 | _len_0 = _len_0 + 1 | 3337 | _len_0 = _len_0 + 1 |
@@ -3341,7 +3341,8 @@ local slice | |||
3341 | local _accum_0 = { } | 3341 | local _accum_0 = { } |
3342 | local _len_0 = 1 | 3342 | local _len_0 = 1 |
3343 | local _list_0 = items | 3343 | local _list_0 = items |
3344 | for _index_0 = 1, #_list_0, 2 do | 3344 | local _max_0 = #_list_0 |
3345 | for _index_0 = 1, _max_0, 2 do | ||
3345 | local item = _list_0[_index_0] | 3346 | local item = _list_0[_index_0] |
3346 | _accum_0[_len_0] = item | 3347 | _accum_0[_len_0] = item |
3347 | _len_0 = _len_0 + 1 | 3348 | _len_0 = _len_0 + 1 |
@@ -3357,8 +3358,7 @@ for key, value in pairs(object) do | |||
3357 | print(key, value) | 3358 | print(key, value) |
3358 | end | 3359 | end |
3359 | local _list_0 = items | 3360 | local _list_0 = items |
3360 | local _max_0 = 4 | 3361 | for _index_0 = 2, 4 do |
3361 | for _index_0 = 2, _max_0 < 0 and #_list_0 + _max_0 + 1 or _max_0 do | ||
3362 | local item = _list_0[_index_0] | 3362 | local item = _list_0[_index_0] |
3363 | print(item) | 3363 | print(item) |
3364 | end | 3364 | end |
diff --git a/spec/outputs/comprehension.lua b/spec/outputs/comprehension.lua index ac4f9d8..663bd44 100644 --- a/spec/outputs/comprehension.lua +++ b/spec/outputs/comprehension.lua | |||
@@ -243,8 +243,11 @@ end | |||
243 | do | 243 | do |
244 | local _accum_0 = { } | 244 | local _accum_0 = { } |
245 | local _len_0 = 1 | 245 | local _len_0 = 1 |
246 | local _min_0 = 1 + 2 | ||
246 | local _max_0 = 3 + 4 | 247 | local _max_0 = 3 + 4 |
247 | for _index_0 = 1 + 2, _max_0 < 0 and #items + _max_0 + 1 or _max_0 do | 248 | _min_0 = _min_0 < 0 and #items + _min_0 + 1 or _min_0 |
249 | _max_0 = _max_0 < 0 and #items + _max_0 + 1 or _max_0 | ||
250 | for _index_0 = _min_0, _max_0 do | ||
248 | local item = items[_index_0] | 251 | local item = items[_index_0] |
249 | _accum_0[_len_0] = item | 252 | _accum_0[_len_0] = item |
250 | _len_0 = _len_0 + 1 | 253 | _len_0 = _len_0 + 1 |
@@ -254,8 +257,11 @@ end | |||
254 | do | 257 | do |
255 | local _accum_0 = { } | 258 | local _accum_0 = { } |
256 | local _len_0 = 1 | 259 | local _len_0 = 1 |
260 | local _min_0 = hello() * 4 | ||
257 | local _max_0 = 2 - thing[4] | 261 | local _max_0 = 2 - thing[4] |
258 | for _index_0 = hello() * 4, _max_0 < 0 and #items + _max_0 + 1 or _max_0 do | 262 | _min_0 = _min_0 < 0 and #items + _min_0 + 1 or _min_0 |
263 | _max_0 = _max_0 < 0 and #items + _max_0 + 1 or _max_0 | ||
264 | for _index_0 = _min_0, _max_0 do | ||
259 | local item = items[_index_0] | 265 | local item = items[_index_0] |
260 | _accum_0[_len_0] = item | 266 | _accum_0[_len_0] = item |
261 | _len_0 = _len_0 + 1 | 267 | _len_0 = _len_0 + 1 |
diff --git a/spec/outputs/destructure.lua b/spec/outputs/destructure.lua index 216d921..ba216b5 100644 --- a/spec/outputs/destructure.lua +++ b/spec/outputs/destructure.lua | |||
@@ -631,8 +631,8 @@ do | |||
631 | local vipStart, regulars, vipEnd = clients[1], (function() | 631 | local vipStart, regulars, vipEnd = clients[1], (function() |
632 | local _accum_0 = { } | 632 | local _accum_0 = { } |
633 | local _len_0 = 1 | 633 | local _len_0 = 1 |
634 | local _max_0 = -2 | 634 | local _max_0 = #clients + -2 + 1 |
635 | for _index_0 = 2, _max_0 < 0 and #clients + _max_0 + 1 or _max_0 do | 635 | for _index_0 = 2, _max_0 do |
636 | local _item_0 = clients[_index_0] | 636 | local _item_0 = clients[_index_0] |
637 | _accum_0[_len_0] = _item_0 | 637 | _accum_0[_len_0] = _item_0 |
638 | _len_0 = _len_0 + 1 | 638 | _len_0 = _len_0 + 1 |
@@ -688,8 +688,8 @@ do | |||
688 | local _accum_0 = { } | 688 | local _accum_0 = { } |
689 | local _len_0 = 1 | 689 | local _len_0 = 1 |
690 | local _list_0 = tb | 690 | local _list_0 = tb |
691 | local _max_0 = -2 | 691 | local _max_0 = #_list_0 + -2 + 1 |
692 | for _index_0 = 2, _max_0 < 0 and #_list_0 + _max_0 + 1 or _max_0 do | 692 | for _index_0 = 2, _max_0 do |
693 | local _item_0 = _list_0[_index_0] | 693 | local _item_0 = _list_0[_index_0] |
694 | _accum_0[_len_0] = _item_0 | 694 | _accum_0[_len_0] = _item_0 |
695 | _len_0 = _len_0 + 1 | 695 | _len_0 = _len_0 + 1 |
@@ -702,8 +702,8 @@ do | |||
702 | a, abc, b, def, sub, d, e = _obj_0[1], _obj_0.abc, _obj_0[2], _obj_0.def, (function() | 702 | a, abc, b, def, sub, d, e = _obj_0[1], _obj_0.abc, _obj_0[2], _obj_0.def, (function() |
703 | local _accum_0 = { } | 703 | local _accum_0 = { } |
704 | local _len_0 = 1 | 704 | local _len_0 = 1 |
705 | local _max_0 = -3 | 705 | local _max_0 = #_obj_0 + -3 + 1 |
706 | for _index_0 = 3, _max_0 < 0 and #_obj_0 + _max_0 + 1 or _max_0 do | 706 | for _index_0 = 3, _max_0 do |
707 | local _item_0 = _obj_0[_index_0] | 707 | local _item_0 = _obj_0[_index_0] |
708 | _accum_0[_len_0] = _item_0 | 708 | _accum_0[_len_0] = _item_0 |
709 | _len_0 = _len_0 + 1 | 709 | _len_0 = _len_0 + 1 |
diff --git a/spec/outputs/lists.lua b/spec/outputs/lists.lua index 1bdfa3e..2ed7b95 100644 --- a/spec/outputs/lists.lua +++ b/spec/outputs/lists.lua | |||
@@ -230,31 +230,36 @@ x = { | |||
230 | 6, | 230 | 6, |
231 | 7 | 231 | 7 |
232 | } | 232 | } |
233 | local _max_0 = -5 | 233 | local _max_0 = #x + -5 + 1 |
234 | for _index_0 = 2, _max_0 < 0 and #x + _max_0 + 1 or _max_0, 2 do | 234 | for _index_0 = 2, _max_0, 2 do |
235 | local y = x[_index_0] | 235 | local y = x[_index_0] |
236 | print(y) | 236 | print(y) |
237 | end | 237 | end |
238 | local _max_1 = 3 | 238 | for _index_0 = 1, 3 do |
239 | for _index_0 = 1, _max_1 < 0 and #x + _max_1 + 1 or _max_1 do | ||
240 | local y = x[_index_0] | 239 | local y = x[_index_0] |
241 | print(y) | 240 | print(y) |
242 | end | 241 | end |
243 | for _index_0 = 2, #x do | 242 | local _max_1 = #x |
243 | for _index_0 = 2, _max_1 do | ||
244 | local y = x[_index_0] | 244 | local y = x[_index_0] |
245 | print(y) | 245 | print(y) |
246 | end | 246 | end |
247 | for _index_0 = 1, #x, 2 do | 247 | local _max_2 = #x |
248 | for _index_0 = 1, _max_2, 2 do | ||
248 | local y = x[_index_0] | 249 | local y = x[_index_0] |
249 | print(y) | 250 | print(y) |
250 | end | 251 | end |
251 | for _index_0 = 2, #x, 2 do | 252 | local _max_3 = #x |
253 | for _index_0 = 2, _max_3, 2 do | ||
252 | local y = x[_index_0] | 254 | local y = x[_index_0] |
253 | print(y) | 255 | print(y) |
254 | end | 256 | end |
255 | local a, b, c = 1, 5, 2 | 257 | local a, b, c = 1, 5, 2 |
256 | local _max_2 = b | 258 | local _min_0 = a |
257 | for _index_0 = a, _max_2 < 0 and #x + _max_2 + 1 or _max_2, c do | 259 | local _max_4 = b |
260 | _min_0 = _min_0 < 0 and #x + _min_0 + 1 or _min_0 | ||
261 | _max_4 = _max_4 < 0 and #x + _max_4 + 1 or _max_4 | ||
262 | for _index_0 = _min_0, _max_4, c do | ||
258 | local y = x[_index_0] | 263 | local y = x[_index_0] |
259 | print(y) | 264 | print(y) |
260 | end | 265 | end |
@@ -287,7 +292,10 @@ do | |||
287 | a | 292 | a |
288 | }) | 293 | }) |
289 | local _list_0 = f | 294 | local _list_0 = f |
290 | for _index_0 = a, #_list_0 do | 295 | local _min_1 = a |
296 | local _max_5 = #_list_0 | ||
297 | _min_1 = _min_1 < 0 and #_list_0 + _min_1 + 1 or _min_1 | ||
298 | for _index_0 = _min_1, _max_5 do | ||
291 | local v = _list_0[_index_0] | 299 | local v = _list_0[_index_0] |
292 | print(v) | 300 | print(v) |
293 | end | 301 | end |
@@ -339,8 +347,8 @@ do | |||
339 | do | 347 | do |
340 | local _accum_0 = { } | 348 | local _accum_0 = { } |
341 | local _len_0 = 1 | 349 | local _len_0 = 1 |
342 | local _max_3 = -2 | 350 | local _max_5 = #transactions + -2 + 1 |
343 | for _index_0 = 2, _max_3 < 0 and #transactions + _max_3 + 1 or _max_3 do | 351 | for _index_0 = 2, _max_5 do |
344 | local _item_0 = transactions[_index_0] | 352 | local _item_0 = transactions[_index_0] |
345 | _accum_0[_len_0] = _item_0 | 353 | _accum_0[_len_0] = _item_0 |
346 | _len_0 = _len_0 + 1 | 354 | _len_0 = _len_0 + 1 |
@@ -405,7 +413,8 @@ do | |||
405 | cloneList1 = function(list) | 413 | cloneList1 = function(list) |
406 | local _accum_0 = { } | 414 | local _accum_0 = { } |
407 | local _len_0 = 1 | 415 | local _len_0 = 1 |
408 | for _index_0 = 1, #list do | 416 | local _max_5 = #list |
417 | for _index_0 = 1, _max_5 do | ||
409 | local _item_0 = list[_index_0] | 418 | local _item_0 = list[_index_0] |
410 | _accum_0[_len_0] = _item_0 | 419 | _accum_0[_len_0] = _item_0 |
411 | _len_0 = _len_0 + 1 | 420 | _len_0 = _len_0 + 1 |
@@ -471,8 +480,8 @@ local _anon_func_1 = function(a) | |||
471 | local _accum_0 = { } | 480 | local _accum_0 = { } |
472 | local _len_0 = 1 | 481 | local _len_0 = 1 |
473 | local _list_0 = a.b.c | 482 | local _list_0 = a.b.c |
474 | local _max_3 = -5 | 483 | local _max_5 = #_list_0 + -5 + 1 |
475 | for _index_0 = 5, _max_3 < 0 and #_list_0 + _max_3 + 1 or _max_3 do | 484 | for _index_0 = 5, _max_5 do |
476 | local _item_1 = _list_0[_index_0] | 485 | local _item_1 = _list_0[_index_0] |
477 | _accum_0[_len_0] = _item_1 | 486 | _accum_0[_len_0] = _item_1 |
478 | _len_0 = _len_0 + 1 | 487 | _len_0 = _len_0 + 1 |
@@ -491,8 +500,8 @@ local _anon_func_2 = function(x) | |||
491 | if _obj_2 ~= nil then | 500 | if _obj_2 ~= nil then |
492 | local _accum_0 = { } | 501 | local _accum_0 = { } |
493 | local _len_0 = 1 | 502 | local _len_0 = 1 |
494 | local _max_3 = -3 | 503 | local _max_5 = #_obj_2 + -3 + 1 |
495 | for _index_0 = 1, _max_3 < 0 and #_obj_2 + _max_3 + 1 or _max_3 do | 504 | for _index_0 = 1, _max_5 do |
496 | local _item_0 = _obj_2[_index_0] | 505 | local _item_0 = _obj_2[_index_0] |
497 | _accum_0[_len_0] = _item_0 | 506 | _accum_0[_len_0] = _item_0 |
498 | _len_0 = _len_0 + 1 | 507 | _len_0 = _len_0 + 1 |
diff --git a/spec/outputs/switch.lua b/spec/outputs/switch.lua index 7a11bac..7c1004b 100644 --- a/spec/outputs/switch.lua +++ b/spec/outputs/switch.lua | |||
@@ -740,8 +740,8 @@ do | |||
740 | do | 740 | do |
741 | local _accum_0 = { } | 741 | local _accum_0 = { } |
742 | local _len_0 = 1 | 742 | local _len_0 = 1 |
743 | local _max_0 = -3 | 743 | local _max_0 = #clientData + -3 + 1 |
744 | for _index_0 = 1, _max_0 < 0 and #clientData + _max_0 + 1 or _max_0 do | 744 | for _index_0 = 1, _max_0 do |
745 | local _item_0 = clientData[_index_0] | 745 | local _item_0 = clientData[_index_0] |
746 | _accum_0[_len_0] = _item_0 | 746 | _accum_0[_len_0] = _item_0 |
747 | _len_0 = _len_0 + 1 | 747 | _len_0 = _len_0 + 1 |
diff --git a/spec/outputs/unicode/comprehension.lua b/spec/outputs/unicode/comprehension.lua index 894e78f..92bce69 100644 --- a/spec/outputs/unicode/comprehension.lua +++ b/spec/outputs/unicode/comprehension.lua | |||
@@ -243,8 +243,11 @@ end | |||
243 | do | 243 | do |
244 | local _accum_0 = { } | 244 | local _accum_0 = { } |
245 | local _len_0 = 1 | 245 | local _len_0 = 1 |
246 | local _min_0 = 1 + 2 | ||
246 | local _max_0 = 3 + 4 | 247 | local _max_0 = 3 + 4 |
247 | for _index_0 = 1 + 2, _max_0 < 0 and #_u5217_u8868 + _max_0 + 1 or _max_0 do | 248 | _min_0 = _min_0 < 0 and #_u5217_u8868 + _min_0 + 1 or _min_0 |
249 | _max_0 = _max_0 < 0 and #_u5217_u8868 + _max_0 + 1 or _max_0 | ||
250 | for _index_0 = _min_0, _max_0 do | ||
248 | local _u9879_u76ee = _u5217_u8868[_index_0] | 251 | local _u9879_u76ee = _u5217_u8868[_index_0] |
249 | _accum_0[_len_0] = _u9879_u76ee | 252 | _accum_0[_len_0] = _u9879_u76ee |
250 | _len_0 = _len_0 + 1 | 253 | _len_0 = _len_0 + 1 |
@@ -254,8 +257,11 @@ end | |||
254 | do | 257 | do |
255 | local _accum_0 = { } | 258 | local _accum_0 = { } |
256 | local _len_0 = 1 | 259 | local _len_0 = 1 |
260 | local _min_0 = _u4f60_u597d() * 4 | ||
257 | local _max_0 = 2 - _u4e1c_u897f[4] | 261 | local _max_0 = 2 - _u4e1c_u897f[4] |
258 | for _index_0 = _u4f60_u597d() * 4, _max_0 < 0 and #_u5217_u8868 + _max_0 + 1 or _max_0 do | 262 | _min_0 = _min_0 < 0 and #_u5217_u8868 + _min_0 + 1 or _min_0 |
263 | _max_0 = _max_0 < 0 and #_u5217_u8868 + _max_0 + 1 or _max_0 | ||
264 | for _index_0 = _min_0, _max_0 do | ||
259 | local _u9879_u76ee = _u5217_u8868[_index_0] | 265 | local _u9879_u76ee = _u5217_u8868[_index_0] |
260 | _accum_0[_len_0] = _u9879_u76ee | 266 | _accum_0[_len_0] = _u9879_u76ee |
261 | _len_0 = _len_0 + 1 | 267 | _len_0 = _len_0 + 1 |
diff --git a/spec/outputs/unicode/lists.lua b/spec/outputs/unicode/lists.lua index a3c329b..3bf6f50 100644 --- a/spec/outputs/unicode/lists.lua +++ b/spec/outputs/unicode/lists.lua | |||
@@ -229,31 +229,36 @@ _u53d8_u91cfx = { | |||
229 | 6, | 229 | 6, |
230 | 7 | 230 | 7 |
231 | } | 231 | } |
232 | local _max_0 = -5 | 232 | local _max_0 = #_u53d8_u91cfx + -5 + 1 |
233 | for _index_0 = 2, _max_0 < 0 and #_u53d8_u91cfx + _max_0 + 1 or _max_0, 2 do | 233 | for _index_0 = 2, _max_0, 2 do |
234 | local _u53d8_u91cfy = _u53d8_u91cfx[_index_0] | 234 | local _u53d8_u91cfy = _u53d8_u91cfx[_index_0] |
235 | _u6253_u5370(_u53d8_u91cfy) | 235 | _u6253_u5370(_u53d8_u91cfy) |
236 | end | 236 | end |
237 | local _max_1 = 3 | 237 | for _index_0 = 1, 3 do |
238 | for _index_0 = 1, _max_1 < 0 and #_u53d8_u91cfx + _max_1 + 1 or _max_1 do | ||
239 | local _u53d8_u91cfy = _u53d8_u91cfx[_index_0] | 238 | local _u53d8_u91cfy = _u53d8_u91cfx[_index_0] |
240 | _u6253_u5370(_u53d8_u91cfy) | 239 | _u6253_u5370(_u53d8_u91cfy) |
241 | end | 240 | end |
242 | for _index_0 = 2, #_u53d8_u91cfx do | 241 | local _max_1 = #_u53d8_u91cfx |
242 | for _index_0 = 2, _max_1 do | ||
243 | local _u53d8_u91cfy = _u53d8_u91cfx[_index_0] | 243 | local _u53d8_u91cfy = _u53d8_u91cfx[_index_0] |
244 | _u6253_u5370(_u53d8_u91cfy) | 244 | _u6253_u5370(_u53d8_u91cfy) |
245 | end | 245 | end |
246 | for _index_0 = 1, #_u53d8_u91cfx, 2 do | 246 | local _max_2 = #_u53d8_u91cfx |
247 | for _index_0 = 1, _max_2, 2 do | ||
247 | local _u53d8_u91cfy = _u53d8_u91cfx[_index_0] | 248 | local _u53d8_u91cfy = _u53d8_u91cfx[_index_0] |
248 | _u6253_u5370(_u53d8_u91cfy) | 249 | _u6253_u5370(_u53d8_u91cfy) |
249 | end | 250 | end |
250 | for _index_0 = 2, #_u53d8_u91cfx, 2 do | 251 | local _max_3 = #_u53d8_u91cfx |
252 | for _index_0 = 2, _max_3, 2 do | ||
251 | local _u53d8_u91cfy = _u53d8_u91cfx[_index_0] | 253 | local _u53d8_u91cfy = _u53d8_u91cfx[_index_0] |
252 | _u6253_u5370(_u53d8_u91cfy) | 254 | _u6253_u5370(_u53d8_u91cfy) |
253 | end | 255 | end |
254 | local _u53d8_u91cfa, _u53d8_u91cfb, _u53d8_u91cfc = 1, 5, 2 | 256 | local _u53d8_u91cfa, _u53d8_u91cfb, _u53d8_u91cfc = 1, 5, 2 |
255 | local _max_2 = _u53d8_u91cfb | 257 | local _min_0 = _u53d8_u91cfa |
256 | for _index_0 = _u53d8_u91cfa, _max_2 < 0 and #_u53d8_u91cfx + _max_2 + 1 or _max_2, _u53d8_u91cfc do | 258 | local _max_4 = _u53d8_u91cfb |
259 | _min_0 = _min_0 < 0 and #_u53d8_u91cfx + _min_0 + 1 or _min_0 | ||
260 | _max_4 = _max_4 < 0 and #_u53d8_u91cfx + _max_4 + 1 or _max_4 | ||
261 | for _index_0 = _min_0, _max_4, _u53d8_u91cfc do | ||
257 | local _u53d8_u91cfy = _u53d8_u91cfx[_index_0] | 262 | local _u53d8_u91cfy = _u53d8_u91cfx[_index_0] |
258 | _u6253_u5370(_u53d8_u91cfy) | 263 | _u6253_u5370(_u53d8_u91cfy) |
259 | end | 264 | end |
diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index cbf976f..9f5a41e 100644 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp | |||
@@ -8180,6 +8180,11 @@ private: | |||
8180 | } | 8180 | } |
8181 | 8181 | ||
8182 | bool transformForEachHead(AssignableNameList_t* nameList, ast_node* loopTarget, str_list& out, bool inClosure) { | 8182 | bool transformForEachHead(AssignableNameList_t* nameList, ast_node* loopTarget, str_list& out, bool inClosure) { |
8183 | enum class NumState { | ||
8184 | Unknown, | ||
8185 | Positive, | ||
8186 | Negtive | ||
8187 | }; | ||
8183 | auto x = nameList; | 8188 | auto x = nameList; |
8184 | str_list temp; | 8189 | str_list temp; |
8185 | str_list vars; | 8190 | str_list vars; |
@@ -8246,15 +8251,35 @@ private: | |||
8246 | for (auto item : chainList) { | 8251 | for (auto item : chainList) { |
8247 | chain->items.push_back(item); | 8252 | chain->items.push_back(item); |
8248 | } | 8253 | } |
8249 | std::string startValue("1"sv); | 8254 | std::string startValue; |
8255 | NumState startStatus = NumState::Unknown; | ||
8250 | if (auto exp = slice->startValue.as<Exp_t>()) { | 8256 | if (auto exp = slice->startValue.as<Exp_t>()) { |
8251 | transformExp(exp, temp, ExpUsage::Closure); | 8257 | transformExp(exp, temp, ExpUsage::Closure); |
8258 | if (temp.back().at(0) == '-') { | ||
8259 | if (_parser.match<Num_t>(temp.back().substr(1))) { | ||
8260 | startStatus = NumState::Negtive; | ||
8261 | } | ||
8262 | } else { | ||
8263 | if (_parser.match<Num_t>(temp.back())) { | ||
8264 | startStatus = NumState::Positive; | ||
8265 | } | ||
8266 | } | ||
8252 | startValue = std::move(temp.back()); | 8267 | startValue = std::move(temp.back()); |
8253 | temp.pop_back(); | 8268 | temp.pop_back(); |
8254 | } | 8269 | } |
8255 | std::string stopValue; | 8270 | std::string stopValue; |
8271 | NumState stopStatus = NumState::Unknown; | ||
8256 | if (auto exp = slice->stopValue.as<Exp_t>()) { | 8272 | if (auto exp = slice->stopValue.as<Exp_t>()) { |
8257 | transformExp(exp, temp, ExpUsage::Closure); | 8273 | transformExp(exp, temp, ExpUsage::Closure); |
8274 | if (temp.back().at(0) == '-') { | ||
8275 | if (_parser.match<Num_t>(temp.back().substr(1))) { | ||
8276 | stopStatus = NumState::Negtive; | ||
8277 | } | ||
8278 | } else { | ||
8279 | if (_parser.match<Num_t>(temp.back())) { | ||
8280 | stopStatus = NumState::Positive; | ||
8281 | } | ||
8282 | } | ||
8258 | stopValue = std::move(temp.back()); | 8283 | stopValue = std::move(temp.back()); |
8259 | temp.pop_back(); | 8284 | temp.pop_back(); |
8260 | } | 8285 | } |
@@ -8276,8 +8301,33 @@ private: | |||
8276 | transformChainValue(chain, temp, ExpUsage::Closure); | 8301 | transformChainValue(chain, temp, ExpUsage::Closure); |
8277 | _buf << prefix << indent() << "local "sv << listVar << " = "sv << temp.back() << nll(nameList); | 8302 | _buf << prefix << indent() << "local "sv << listVar << " = "sv << temp.back() << nll(nameList); |
8278 | } | 8303 | } |
8304 | if (startValue.empty()) { | ||
8305 | startValue = "1"s; | ||
8306 | startStatus = NumState::Positive; | ||
8307 | } | ||
8308 | std::string minVar; | ||
8309 | if (startStatus != NumState::Positive) { | ||
8310 | std::string prefix; | ||
8311 | if (!extraScope && !inClosure && needScope) { | ||
8312 | extraScope = true; | ||
8313 | prefix = indent() + "do"s + nll(x); | ||
8314 | pushScope(); | ||
8315 | } | ||
8316 | minVar = getUnusedName("_min_"sv); | ||
8317 | varBefore.push_back(minVar); | ||
8318 | if (startStatus == NumState::Negtive) { | ||
8319 | _buf << prefix << indent() << "local "sv << minVar << " = "sv << "#"sv << listVar << " + "sv << startValue << " + 1"sv << nll(nameList); | ||
8320 | } else { | ||
8321 | _buf << prefix << indent() << "local "sv << minVar << " = "sv << startValue << nll(nameList); | ||
8322 | } | ||
8323 | } | ||
8324 | bool defaultStop = false; | ||
8325 | if (stopValue.empty()) { | ||
8326 | stopValue = "#"s + listVar; | ||
8327 | defaultStop = true; | ||
8328 | } | ||
8279 | std::string maxVar; | 8329 | std::string maxVar; |
8280 | if (!stopValue.empty()) { | 8330 | if (stopStatus != NumState::Positive) { |
8281 | std::string prefix; | 8331 | std::string prefix; |
8282 | if (!extraScope && !inClosure && needScope) { | 8332 | if (!extraScope && !inClosure && needScope) { |
8283 | extraScope = true; | 8333 | extraScope = true; |
@@ -8286,14 +8336,45 @@ private: | |||
8286 | } | 8336 | } |
8287 | maxVar = getUnusedName("_max_"sv); | 8337 | maxVar = getUnusedName("_max_"sv); |
8288 | varBefore.push_back(maxVar); | 8338 | varBefore.push_back(maxVar); |
8289 | _buf << prefix << indent() << "local "sv << maxVar << " = "sv << stopValue << nll(nameList); | 8339 | if (stopStatus == NumState::Negtive) { |
8340 | _buf << indent() << "local "sv << maxVar << " = "sv << "#"sv << listVar << " + "sv << stopValue << " + 1"sv << nll(nameList); | ||
8341 | } else { | ||
8342 | _buf << prefix << indent() << "local "sv << maxVar << " = "sv << stopValue << nll(nameList); | ||
8343 | } | ||
8344 | } | ||
8345 | if (startStatus == NumState::Unknown) { | ||
8346 | _buf << indent() << minVar << " = "sv << minVar << " < 0 and #"sv << listVar << " + "sv << minVar << " + 1 or "sv << minVar << nll(nameList); | ||
8347 | } | ||
8348 | if (!defaultStop && stopStatus == NumState::Unknown) { | ||
8349 | _buf << indent() << maxVar << " = "sv << maxVar << " < 0 and #"sv << listVar << " + "sv << maxVar << " + 1 or "sv << maxVar << nll(nameList); | ||
8290 | } | 8350 | } |
8291 | _buf << indent() << "for "sv << indexVar << " = "sv; | 8351 | _buf << indent() << "for "sv << indexVar << " = "sv; |
8292 | _buf << startValue << ", "sv; | 8352 | if (startValue.empty()) { |
8353 | _buf << "1"sv; | ||
8354 | } else { | ||
8355 | switch (startStatus) { | ||
8356 | case NumState::Unknown: | ||
8357 | case NumState::Negtive: | ||
8358 | _buf << minVar; | ||
8359 | break; | ||
8360 | case NumState::Positive: | ||
8361 | _buf << startValue; | ||
8362 | break; | ||
8363 | } | ||
8364 | } | ||
8365 | _buf << ", "sv; | ||
8293 | if (stopValue.empty()) { | 8366 | if (stopValue.empty()) { |
8294 | _buf << "#"sv << listVar; | 8367 | _buf << "#"sv << listVar; |
8295 | } else { | 8368 | } else { |
8296 | _buf << maxVar << " < 0 and #"sv << listVar << " + "sv << maxVar << " + 1 or "sv << maxVar; | 8369 | switch (stopStatus) { |
8370 | case NumState::Unknown: | ||
8371 | case NumState::Negtive: | ||
8372 | _buf << maxVar; | ||
8373 | break; | ||
8374 | case NumState::Positive: | ||
8375 | _buf << stopValue; | ||
8376 | break; | ||
8377 | } | ||
8297 | } | 8378 | } |
8298 | if (!stepValue.empty()) { | 8379 | if (!stepValue.empty()) { |
8299 | _buf << ", "sv << stepValue; | 8380 | _buf << ", "sv << stepValue; |