nadesiko3 3.2.30 → 3.2.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/demo/index.html +0 -1
  2. package/package.json +13 -5
  3. package/release/_hash.txt +28 -28
  4. package/release/_script-tags.txt +13 -13
  5. package/release/command.json +1 -1
  6. package/release/command.json.js +1 -1
  7. package/release/command_cnako3.json +1 -1
  8. package/release/command_list.json +1 -1
  9. package/release/editor.js +1 -1
  10. package/release/josi.json +1 -0
  11. package/release/nako_gen_async.js +1 -1
  12. package/release/plugin_markup.js +1 -1
  13. package/release/stats.json +1 -1
  14. package/release/version.js +1 -1
  15. package/release/wnako3.js +1 -1
  16. package/release/wnako3webworker.js +1 -1
  17. package/release/wnako3webworker.js.LICENSE.txt +4 -0
  18. package/release/yoyakugo.json +3 -0
  19. package/src/nako3.js +6 -1
  20. package/src/nako_from_dncl.js +239 -0
  21. package/src/nako_gen.js +24 -9
  22. package/src/nako_gen_async.js +97 -10
  23. package/src/nako_josi_list.js +1 -1
  24. package/src/nako_parser3.js +147 -25
  25. package/src/nako_parser_base.js +3 -0
  26. package/src/nako_reserved_words.js +4 -1
  27. package/src/nako_version.js +2 -2
  28. package/src/plugin_browser.js +14 -0
  29. package/src/plugin_browser_ajax.js +4 -3
  30. package/src/plugin_browser_canvas.js +0 -1
  31. package/src/plugin_browser_chart.js +0 -2
  32. package/src/plugin_browser_dom_basic.js +0 -2
  33. package/src/plugin_browser_dom_parts.js +273 -79
  34. package/src/plugin_node.js +2 -2
  35. package/src/plugin_system.js +408 -20
  36. package/test/common/dncl_test.js +57 -0
  37. package/test/common/flow_test.js +14 -0
  38. package/test/common/plugin_system_test.js +117 -0
  39. package/test/common/variable_scope_test.js +3 -0
@@ -58,6 +58,10 @@
58
58
  !*** ./src/plugin_worker.js ***!
59
59
  \******************************/
60
60
 
61
+ /*!*******************************!*\
62
+ !*** ./src/nako_from_dncl.js ***!
63
+ \*******************************/
64
+
61
65
  /*!*******************************!*\
62
66
  !*** ./src/nako_josi_list.js ***!
63
67
  \*******************************/
@@ -4,6 +4,8 @@
4
4
  "間",
5
5
  "間繰返",
6
6
  "繰返",
7
+ "増繰返",
8
+ "減繰返",
7
9
  "反復",
8
10
  "抜",
9
11
  "続",
@@ -25,6 +27,7 @@
25
27
  "関数",
26
28
  "インデント構文",
27
29
  "非同期モード",
30
+ "DNCLモード",
28
31
  "モード設定",
29
32
  "取込"
30
33
  ]
package/src/nako3.js CHANGED
@@ -7,6 +7,7 @@ const NakoLexer = require('./nako_lexer')
7
7
  const Prepare = require('./nako_prepare')
8
8
  const NakoGenSync = require('./nako_gen')
9
9
  const NakoIndent = require('./nako_indent')
10
+ const NakoDncl = require('./nako_from_dncl')
10
11
  const PluginSystem = require('./plugin_system')
11
12
  const PluginMath = require('./plugin_math')
12
13
  const PluginPromise = require('./plugin_promise')
@@ -83,6 +84,7 @@ function NakoGen (mode) {
83
84
  * column?: number
84
85
  * }
85
86
  * genMode?: string
87
+ * checkInit?: boolean
86
88
  * }} Ast
87
89
  *
88
90
  * @typedef {(
@@ -301,9 +303,11 @@ class NakoCompiler {
301
303
  }
302
304
  // インデント構文 (#596)
303
305
  const { code: code2, insertedLines, deletedLines } = NakoIndent.convert(code, filename)
306
+ // DNCL構文 (#1140)
307
+ const code3 = NakoDncl.convert(code2, filename)
304
308
 
305
309
  // 全角半角の統一処理
306
- const preprocessed = this.prepare.convert(code2)
310
+ const preprocessed = this.prepare.convert(code3)
307
311
 
308
312
  const tokenizationSourceMapping = new SourceMappingOfTokenization(code2.length, preprocessed)
309
313
  const indentationSyntaxSourceMapping = new SourceMappingOfIndentSyntax(code2, insertedLines, deletedLines)
@@ -540,6 +544,7 @@ class NakoCompiler {
540
544
  /** @type {Ast} */
541
545
  let ast
542
546
  try {
547
+ this.parser.genMode = 'sync' // set default
543
548
  ast = this.parser.parse(lexerOutput.tokens)
544
549
  } catch (err) {
545
550
  if (typeof err.startOffset !== 'number') {
@@ -0,0 +1,239 @@
1
+ /**
2
+ * DNCLに対応する構文
3
+ */
4
+ const { NakoIndentError } = require('./nako_errors')
5
+ const NakoPrepare = require('./nako_prepare')
6
+
7
+ const DNCL_KEYWORDS = ['!DNCLモード']
8
+ /**
9
+ * DNCLのソースコードをなでしこに変換する
10
+ * @param {String} src
11
+ * @param {String} filename
12
+ * @returns {String} converted soruce
13
+ */
14
+ function convert(src, filename) {
15
+ // 改行を合わせる
16
+ src = src.replace(/(\r\n|\r)/g, '\n')
17
+ // 「!DNCLモード」を使うかチェック
18
+ if (!isIndentSyntaxEnabled(src)) { return src }
19
+ let result = dncl2nako(src, filename)
20
+ // console.log("=====\n" + result)
21
+ // process.exit()
22
+ return result
23
+ }
24
+
25
+ function isIndentSyntaxEnabled(src) {
26
+ // プログラム冒頭に「!DNCLモード」があればDNCL構文が有効
27
+ const keywords = DNCL_KEYWORDS
28
+ const lines = src.split('\n', 30)
29
+ for (const line of lines) {
30
+ const line2 = line.replace('!', '!')
31
+ if (keywords.indexOf(line2) >= 0) {
32
+ return true
33
+ }
34
+ }
35
+ return false
36
+ }
37
+
38
+ /**
39
+ * make space string
40
+ * @param {number} n
41
+ */
42
+ function make_spaces(n) {
43
+ let s = ''
44
+ for (let i = 0; i < n; i++) {
45
+ s += ' '
46
+ }
47
+ return s
48
+ }
49
+
50
+ /**
51
+ * DNCLからなでしこに変換する(判定なし)
52
+ * @param {string} src
53
+ * @param {string} filename
54
+ * @returns {string} converted source
55
+ */
56
+ function dncl2nako(src, filename) {
57
+ // 全角半角を統一
58
+ src = conv2half(src)
59
+ // 行頭の「|」はインデントを表す記号
60
+ const a = src.split('\n')
61
+ for (let i = 0; i < a.length; i++) {
62
+ a[i] = a[i].replace(/^(\s*[|\s]+)(.*$)/, (m0, m1, m2) => {
63
+ return make_spaces(m1.length) + m2
64
+ })
65
+ }
66
+ src = a.join('\n')
67
+ // ---------------------------------
68
+ // 置換開始
69
+ // ---------------------------------
70
+ // 単純置換リスト
71
+ const simple_conv_list = {
72
+ 'を実行する': 'ここまで',
73
+ 'を実行し,そうでなくもし': '違えば、もし',
74
+ 'を実行し,そうでなくもし': '違えば、もし',
75
+ 'を実行し、そうでなくもし': '違えば、もし',
76
+ 'を実行し,そうでなければ': '違えば',
77
+ 'を実行し,そうでなければ': '違えば',
78
+ 'を実行し、そうでなければ': '違えば',
79
+ 'を繰り返す': 'ここまで',
80
+ '改行なしで表示': '継続表示',
81
+ 'のすべての値を0にする': '=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]',
82
+ 'ずつ増やしながら':'ずつ増やし繰り返す',
83
+ 'ずつ減らしながら':'ずつ減らし繰り返す',
84
+ }
85
+
86
+ let result = ''
87
+ while (src !='') {
88
+ // 代入記号を変更
89
+ const ch = src.charAt(0)
90
+ // 空白を飛ばす
91
+ if (ch === ' ' || ch === ' ' || ch == '\t') {
92
+ result += ch
93
+ src = src.substring(1)
94
+ continue
95
+ }
96
+ // 1行先読み
97
+ let line = ''
98
+ const i = src.indexOf('\n')
99
+ if (i >= 0) {
100
+ line = src.substring(0, i)
101
+ } else {
102
+ line = src
103
+ }
104
+ //「var を n 増やす」を「var = var + 1」と置き換える
105
+ const r = line.match(/^([a-zA-Z_][a-zA-Z0-9_]*)\s*を\s*([0-9a-zA-Z_]+)\s*(増やす|減らす)/)
106
+ if (r) {
107
+ const var_name = r[1]
108
+ const inc_val = r[2]
109
+ const inc_dec = r[3]
110
+ if (inc_dec == '増やす') {
111
+ result += `${var_name} = ${var_name} + ${inc_val};`
112
+ } else {
113
+ result += `${var_name} = ${var_name} - ${inc_val};`
114
+ }
115
+ src = src.substring(r[0].length)
116
+ continue
117
+ }
118
+ //「S1とS2とS3を表示する」を「(S1)&(S2)&S3)を表示」と置き換える
119
+ // あまりスマートではないが手抜きで
120
+ if (line.indexOf('表示') >= 0) {
121
+ const r5 = line.match(/^(.+?)と(.+?)と(.+?)と(.+?)と(.+?)を表示/)
122
+ if (r5) {
123
+ const s1 = r5[1]
124
+ const s2 = r5[2]
125
+ const s3 = r5[3]
126
+ const s4 = r5[4]
127
+ const s5 = r5[4]
128
+ result += `(${s1})&(${s2})&(${s3})&(${s4})&(${s5})を表示`
129
+ src = src.substring(r5[0].length)
130
+ continue
131
+ }
132
+ const r4 = line.match(/^(.+?)と(.+?)と(.+?)と(.+?)を表示/)
133
+ if (r4) {
134
+ const s1 = r4[1]
135
+ const s2 = r4[2]
136
+ const s3 = r4[3]
137
+ const s4 = r4[4]
138
+ result += `(${s1})&(${s2})&(${s3})&(${s4})を表示`
139
+ src = src.substring(r4[0].length)
140
+ continue
141
+ }
142
+ const r3 = line.match(/^(.+?)と(.+?)と(.+?)を表示/)
143
+ if (r3) {
144
+ const s1 = r3[1]
145
+ const s2 = r3[2]
146
+ const s3 = r3[3]
147
+ result += `(${s1})&(${s2})&(${s3})を表示`
148
+ src = src.substring(r3[0].length)
149
+ continue
150
+ }
151
+ const r2 = line.match(/^(.+?)と(.+?)を表示/)
152
+ if (r2) {
153
+ const s1 = r2[1]
154
+ const s2 = r2[2]
155
+ result += `(${s1})&(${s2})を表示`
156
+ src = src.substring(r2[0].length)
157
+ continue
158
+ }
159
+ }
160
+ // 『もしj>hakosuならばhakosu←jを実行する』のような単文のもし文
161
+ const rif = line.match(/^もし(.+)を実行する(。|.)*/)
162
+ if (rif) {
163
+ const sent = dncl2nako(rif[1], filename)
164
+ result += `もし、${sent};`
165
+ src = src.substring(rif[0].length)
166
+ continue
167
+ }
168
+ // 一覧から単純な変換
169
+ {
170
+ let flag = false
171
+ for (let key in simple_conv_list) {
172
+ const src_key = src.substring(0, key.length)
173
+ if (src_key === key) {
174
+ result += simple_conv_list[key]
175
+ src = src.substring(key.length)
176
+ flag = true
177
+ break
178
+ }
179
+ }
180
+ if (flag) { continue }
181
+ }
182
+
183
+ // 1文字削る
184
+ src = src.substring(1)
185
+ result += ch
186
+ }
187
+ return result
188
+ }
189
+
190
+ /**
191
+ * 半角に変換
192
+ * @param {String} src
193
+ * @returns {string} converted source
194
+ */
195
+ function conv2half(src) {
196
+ const prepare = new NakoPrepare() // `※`, `//`, `/*` といったパターン全てに対応するために必要
197
+ // 全角半角の統一
198
+ let result = ''
199
+ let flagStr = false
200
+ let flagStrClose = ''
201
+ for (let i = 0; i < src.length; i++) {
202
+ let c = src.charAt(i)
203
+ let cHalf = prepare.convert1ch(c)
204
+ if (flagStr) {
205
+ if (cHalf === flagStrClose) {
206
+ flagStr = false
207
+ flagStrClose = ''
208
+ result += cHalf
209
+ continue
210
+ }
211
+ result += c
212
+ continue
213
+ }
214
+ if (cHalf === '「') {
215
+ flagStr = true
216
+ flagStrClose = '」'
217
+ result += cHalf
218
+ continue
219
+ }
220
+ if (cHalf === '"') {
221
+ flagStr = true
222
+ flagStrClose = '"'
223
+ result += cHalf
224
+ continue
225
+ }
226
+ // 単純な置き換えはここでやってしまう
227
+ // 配列記号の { ... } を [ ... ] に置換
228
+ if (cHalf === '{') { cHalf = '[' }
229
+ if (cHalf === '}') { cHalf = ']' }
230
+ if (cHalf === '←') { cHalf = '=' }
231
+ result += cHalf
232
+ }
233
+ return result
234
+ }
235
+
236
+
237
+ module.exports = {
238
+ convert,
239
+ }
package/src/nako_gen.js CHANGED
@@ -703,6 +703,7 @@ try {
703
703
  const topOfFunction = '(function(){\n'
704
704
  const endOfFunction = '})'
705
705
  let variableDeclarations = ''
706
+ let popStack = ''
706
707
  const initialNames = new Set()
707
708
  if (this.speedMode.invalidSore === 0) {
708
709
  initialNames.add('それ')
@@ -712,6 +713,8 @@ try {
712
713
  this.varslistSet.push(this.varsSet)
713
714
  // JSの引数と引数をバインド
714
715
  variableDeclarations += ' var 引数 = arguments;\n'
716
+ // ローカル変数を生成
717
+ variableDeclarations += ' var __vars = {};\n'
715
718
  // 宣言済みの名前を保存
716
719
  const varsDeclared = Array.from(this.varsSet.names.values())
717
720
  let code = ''
@@ -749,7 +752,6 @@ try {
749
752
  // パフォーマンスモニタ:ユーザ関数のinject
750
753
  code += performanceMonitorInjectAtEnd
751
754
  // 関数の末尾に、ローカル変数をPOP
752
- code += endOfFunction
753
755
 
754
756
  // 関数内で定義されたローカル変数の宣言
755
757
  let needsVarsObject = false
@@ -765,10 +767,6 @@ try {
765
767
  if (!NakoGen.isValidIdentifier('それ') && this.speedMode.invalidSore === 0) {
766
768
  needsVarsObject = true
767
769
  }
768
- // 一度でも__varsを使ったら、それも宣言する。
769
- if (needsVarsObject) {
770
- variableDeclarations += ' var __vars = {};\n'
771
- }
772
770
  if (this.speedMode.invalidSore === 0) {
773
771
  if (NakoGen.isValidIdentifier('それ')) {
774
772
  variableDeclarations += ' var それ = \'\';\n'
@@ -776,7 +774,8 @@ try {
776
774
  variableDeclarations += ` ${this.varname('それ')} = '';`
777
775
  }
778
776
  }
779
- code = topOfFunction + performanceMonitorInjectAtStart + variableDeclarations + code
777
+ code = topOfFunction + performanceMonitorInjectAtStart + variableDeclarations + code + popStack
778
+ code += endOfFunction
780
779
 
781
780
  if (name) { this.nako_func[name].fn = code }
782
781
 
@@ -852,14 +851,28 @@ try {
852
851
  convLetArray (node) {
853
852
  const name = this._convGen(node.name, true)
854
853
  const list = node.index
854
+ let codeInit = ''
855
855
  let code = name
856
+ let codeArray = ''
857
+ // codeInit?
858
+ if (node.checkInit) {
859
+ codeInit += `\n/*配列初期化*/if (typeof(${name}) !== 'object') { ${name} = [] }; `
860
+ for (let i = 0; i < list.length; i++) {
861
+ const idx = this._convGen(list[i], true)
862
+ codeArray += `[${idx}]`
863
+ codeInit += `if (typeof(${name}${codeArray}) !== 'object') { ${name}${codeArray} = [] }; `
864
+ }
865
+ codeInit += '\n'
866
+ }
867
+ // array
856
868
  for (let i = 0; i < list.length; i++) {
857
869
  const idx = this._convGen(list[i], true)
858
870
  code += '[' + idx + ']'
859
871
  }
860
872
  const value = this._convGen(node.value, true)
861
873
  code += ' = ' + value + ';\n'
862
- return this.convLineno(node, false) + code
874
+ // generate code
875
+ return this.convLineno(node, false) + codeInit + code
863
876
  }
864
877
 
865
878
  convGenLoop (node) {
@@ -888,6 +901,8 @@ try {
888
901
  // ループ条件を確認
889
902
  const kara = this._convGen(node.from, true)
890
903
  const made = this._convGen(node.to, true)
904
+ let inc = this._convGen(node.inc, true)
905
+ if (inc == null || inc == undefined || inc == 'null') { inc = 1 }
891
906
  // ループ内のブロック内容を得る
892
907
  const block = this.convGenLoop(node.block)
893
908
  // ループ条件を変数に入れる用
@@ -902,12 +917,12 @@ try {
902
917
  `const ${varFrom} = ${kara};\n` +
903
918
  `const ${varTo} = ${made};\n` +
904
919
  `if (${varFrom} <= ${varTo}) { // up\n` +
905
- ` for (let ${varI} = ${varFrom}; ${varI} <= ${varTo}; ${varI}++) {\n` +
920
+ ` for (let ${varI} = ${varFrom}; ${varI} <= ${varTo}; ${varI}+= ${inc}) {\n` +
906
921
  ` ${sorePrefex}${word} = ${varI};\n` +
907
922
  ` ${block}\n` +
908
923
  ' };\n' +
909
924
  '} else { // down\n' +
910
- ` for (let ${varI} = ${varFrom}; ${varI} >= ${varTo}; ${varI}--) {\n` +
925
+ ` for (let ${varI} = ${varFrom}; ${varI} >= ${varTo}; ${varI}-= ${inc}) {\n` +
911
926
  ` ${sorePrefex}${word} = ${varI};` + '\n' +
912
927
  ` ${block}\n` +
913
928
  ' };\n' +
@@ -18,8 +18,7 @@ const NakoGen = require('./nako_gen')
18
18
  /**
19
19
  * なでしこのインタプリタコード
20
20
  */
21
- const
22
- NakoCodeNop = 'NOP'
21
+ const NakoCodeNop = 'NOP'
23
22
  const NakoCodeLabel = 'LBL'
24
23
  const NakoCodeEOL = 'EOL'
25
24
  const NakoCodeJump = 'JMP' // JUMP addr
@@ -550,13 +549,15 @@ try {
550
549
  if (sys.index >= sys.codeSize || sys.index < 0) {return}
551
550
  const __v0 = sys.__v0
552
551
  try {
553
- while (sys.index < sys.codeSize || sys.index < 0) {
552
+ sys.inLoop = true
553
+ while (sys.index < sys.codeSize && sys.index >= 0) {
554
554
  // console.log('@@[run]', sys.index)
555
555
  switch (sys.index) {
556
556
  // --- CODE.BEGIN ---
557
557
  ${result}
558
558
  // --- CODE.END ---
559
559
  default:
560
+ sys.inLoop = false
560
561
  console.log(sys.index, sys.__stack)
561
562
  throw new Error('Invalid sys.index:' + sys.index)
562
563
  break
@@ -568,8 +569,13 @@ try {
568
569
  } else {
569
570
  sys.index++
570
571
  }
571
- if (sys.async) { sys.async = false; break}
572
+ if (sys.async) {
573
+ sys.__saveSysenv(sys)
574
+ sys.async = false
575
+ break
576
+ }
572
577
  } // end of while
578
+ sys.inLoop = false
573
579
  } catch (e) {
574
580
  sys.__errorAsync(e, sys)
575
581
  }
@@ -595,6 +601,12 @@ try {
595
601
  sys.nextIndex = no;
596
602
  }
597
603
  this.__return = sys => {
604
+ if (sys.__callstack.length === 0) {
605
+ sys.__destroySysenv(sys, sys.curSysenv.envid)
606
+ sys.index = -2
607
+ sys.nextIndex = -1
608
+ return
609
+ }
598
610
  const sore = sys.__vars['それ'];
599
611
  sys.__varslist.pop();
600
612
  const info = sys.__callstack.pop();
@@ -616,15 +628,22 @@ try {
616
628
  }
617
629
  this.__callNakoCode = (no, backNo, sys) => {
618
630
  this.__call(backNo, sys)
619
- sys.async = true
631
+ sys.nextIndex = no
632
+ const sysenv = sys.setAsync(sys)
620
633
  setTimeout(() => {
621
634
  // console.log('//__callNakoCode, back=', backNo, 'no=', no)
622
- sys.async = false
623
- sys.nextIndex = -1
624
- sys.index = no
625
- sys.nextAsync(sys)
635
+ sys.compAsync(sys, sysenv)
626
636
  } ,1)
627
637
  }
638
+ this.__callNakoCodeEntry = (no, sys) => {
639
+ sys.__saveSysenv(sys)
640
+ sys.curSysenv = sys.__generateSysenv(sys)
641
+ sys.__restoreSysenv(sys)
642
+ sys.__vars = {"それ":""}
643
+ sys.__varslist.push(sys.__vars)
644
+ sys.index = no;
645
+ sys.nextAsync(sys)
646
+ }
628
647
  this.__callObj = (vname, curNo, sys) => {
629
648
  if (sys.__vars[vname]) {
630
649
  const fname = sys.__vars[vname]
@@ -639,7 +658,69 @@ try {
639
658
  }
640
659
  throw new Error('async error in __callObj::', vname)
641
660
  }
661
+ this.__generateSysenv = sys => {
662
+ sys.envid = ( sys.envid == null ? 0 : sys.envid ) + 1
663
+ const sysenv = {
664
+ callstack: [],
665
+ varstack: [],
666
+ varslist: [sys.__varslist[0], sys.__varslist[1], sys.__varslist[2]],
667
+ index: -1,
668
+ nextIndex: -1,
669
+ tryIndex: -1,
670
+ envid: sys.envid
671
+ }
672
+ sysenv.vars = sysenv.varslist[2]
673
+ if (sys.sysenvs == null) { sys.sysenvs={} }
674
+ sys.sysenvs[sys.envid] = sysenv
675
+ // console.log('generete envid '+sys.envid)
676
+ return sysenv
677
+ }
678
+ this.__destroySysenv = (sys, envid) => {
679
+ delete sys.sysenvs[envid]
680
+ // console.log('destroy envid '+envid)
681
+ }
682
+ this.__saveSysenv = sys => {
683
+ const sysenv = sys.curSysenv
684
+ sysenv.callstack = sys.__callstack
685
+ sysenv.varstack = sys.__stack
686
+ sysenv.varslist = sys.__varslist
687
+ sysenv.vars = sys.__vars
688
+ sysenv.index = sys.index
689
+ sysenv.nextIndex = sys.nextIndex
690
+ sysenv.tryIndex = sys.tryIndex
691
+ }
692
+ this.__restoreSysenv = sys => {
693
+ const sysenv = sys.curSysenv
694
+ sys.__callstack = sysenv.callstack
695
+ sys.__stack = sysenv.varstack
696
+ sys.__varslist = sysenv.varslist
697
+ sys.__vars = sysenv.vars
698
+ ___vars = sys.__vars
699
+ sys.index = sysenv.index
700
+ sys.nextIndex = sysenv.nextIndex
701
+ sys.tryIndex = sysenv.tryIndex
702
+ }
703
+ this.setAsync = sys => {
704
+ sys.async = true
705
+ return sys.curSysenv
706
+ }
707
+ this.compAsync = (sys,sysenv) => {
708
+ if (sys.async && sys.curSysenv != null && sysenv != null && sys.curSysenv.envid === sysenv.envid) {
709
+ sys.async = false
710
+ } else {
711
+ if (sys.curSysenv == null || sysenv == null || sys.curSysenv.envid !== sysenv.envid) {
712
+ sys.__saveSysenv(sys)
713
+ const envid = sys.curSysenv.envid
714
+ sys.curSysenv = sysenv
715
+ sys.__restoreSysenv(sys)
716
+ // console.log('switch envid '+envid+' to '+sys.curSysenv.envid)
717
+ }
718
+ sys.nextAsync(sys)
719
+ }
720
+ }
721
+
642
722
  this.__resetAsync(this)
723
+ this.curSysenv = this.__generateSysenv(this)
643
724
  this.nextAsync(this)
644
725
  //-------------------------
645
726
  `
@@ -1076,8 +1157,14 @@ try {
1076
1157
  josi: meta.josi,
1077
1158
  fn: '(function(){\n' +
1078
1159
  ' const sys = (arguments.length > 0) ? arguments[arguments.length-1] : {}; \n' +
1160
+ ' if (sys.newenv) { \n' +
1161
+ ' sys.newenv = false\n' +
1162
+ ` sys.__callNakoCodeEntry(sys.__labels['${funcName}'], sys);` + '\n' +
1163
+ ' } else {\n' +
1079
1164
  ' ' + codeCall + '\n' +
1080
- ` sys.__callNakoCode(sys.__labels['${funcName}'], sys.nextIndex, sys); })`,
1165
+ ` sys.__callNakoCode(sys.__labels['${funcName}'], sys.nextIndex, sys);` + '\n' +
1166
+ ' if (!sys.inLoop) { sys.nextAsync(sys) }\n' +
1167
+ ' } })',
1081
1168
  type: 'func'
1082
1169
  }
1083
1170
 
@@ -6,7 +6,7 @@ const josiList = [
6
6
  'について', 'くらい', 'なのか', 'までを', 'までの', 'による',
7
7
  'とは', 'から', 'まで', 'だけ', 'より', 'ほど', 'など',
8
8
  'いて', 'えて', 'きて', 'けて', 'して', 'って', 'にて', 'みて',
9
- 'めて', 'ねて', 'では', 'には', 'は~', 'んで',
9
+ 'めて', 'ねて', 'では', 'には', 'は~', 'んで', 'ずつ',
10
10
  'は', 'を', 'に', 'へ', 'で', 'と', 'が', 'の'
11
11
  ]
12
12