nadesiko3 3.2.32 → 3.2.36
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.
- package/package.json +12 -4
- package/release/_hash.txt +28 -28
- package/release/_script-tags.txt +13 -13
- package/release/command.json +1 -1
- package/release/command.json.js +1 -1
- package/release/command_cnako3.json +1 -1
- package/release/command_list.json +1 -1
- package/release/editor.js +1 -1
- package/release/josi.json +1 -0
- package/release/nako_gen_async.js +1 -1
- package/release/plugin_markup.js +1 -1
- package/release/stats.json +1 -1
- package/release/version.js +1 -1
- package/release/wnako3.js +1 -1
- package/release/wnako3webworker.js +1 -1
- package/release/wnako3webworker.js.LICENSE.txt +4 -0
- package/release/yoyakugo.json +3 -0
- package/src/nako3.js +5 -1
- package/src/nako_from_dncl.js +251 -0
- package/src/nako_gen.js +27 -9
- package/src/nako_josi_list.js +1 -1
- package/src/nako_parser3.js +144 -24
- package/src/nako_parser_base.js +3 -0
- package/src/nako_reserved_words.js +4 -1
- package/src/nako_version.js +2 -2
- package/src/plugin_browser_canvas.js +0 -1
- package/src/plugin_browser_chart.js +0 -2
- package/src/plugin_browser_dom_basic.js +0 -2
- package/src/plugin_browser_dom_parts.js +100 -27
- package/src/plugin_system.js +34 -2
- package/test/common/dncl_test.js +63 -0
- package/test/common/flow_test.js +14 -0
- package/test/common/plugin_system_test.js +13 -0
- package/test/common/variable_scope_test.js +3 -0
package/src/plugin_system.js
CHANGED
|
@@ -98,6 +98,8 @@ const PluginSystem = {
|
|
|
98
98
|
const dateStr = `${a[0]}-${a[1]}-${a[2]} ${z2(a[3])}:${z2(a[4])}:${z2(a[5])}`
|
|
99
99
|
return new Date(dateStr)
|
|
100
100
|
}
|
|
101
|
+
// 『継続表示』のための一時変数(『表示』実行で初期化)
|
|
102
|
+
sys.__printPool = ''
|
|
101
103
|
}
|
|
102
104
|
},
|
|
103
105
|
'!クリア': {
|
|
@@ -182,11 +184,24 @@ const PluginSystem = {
|
|
|
182
184
|
josi: [['を', 'と']],
|
|
183
185
|
pure: true,
|
|
184
186
|
fn: function (s, sys) {
|
|
187
|
+
// 継続表示の一時プールを出力
|
|
188
|
+
s = sys.__printPool + s
|
|
189
|
+
sys.__printPool = ''
|
|
190
|
+
//
|
|
185
191
|
sys.__varslist[0]['表示ログ'] += (s + '\n')
|
|
186
192
|
sys.logger.send('stdout', s + '')
|
|
187
193
|
},
|
|
188
194
|
return_none: true
|
|
189
195
|
},
|
|
196
|
+
'継続表示': { // @Sを改行なしで表示 // @けいぞくひょうじ
|
|
197
|
+
type: 'func',
|
|
198
|
+
josi: [['を', 'と']],
|
|
199
|
+
pure: true,
|
|
200
|
+
fn: function (s, sys) {
|
|
201
|
+
sys.__printPool += s
|
|
202
|
+
},
|
|
203
|
+
return_none: true
|
|
204
|
+
},
|
|
190
205
|
'表示ログ': { type: 'const', value: '' }, // @ひょうじろぐ
|
|
191
206
|
'表示ログクリア': { // @表示ログを空にする // @ひょうじろぐくりあ
|
|
192
207
|
type: 'func',
|
|
@@ -266,6 +281,22 @@ const PluginSystem = {
|
|
|
266
281
|
return a % b
|
|
267
282
|
}
|
|
268
283
|
},
|
|
284
|
+
'二乗': { // @Aを二乗する // @にじょう
|
|
285
|
+
type: 'func',
|
|
286
|
+
josi: [['の', 'を']],
|
|
287
|
+
pure: true,
|
|
288
|
+
fn: function (a) {
|
|
289
|
+
return a * a
|
|
290
|
+
}
|
|
291
|
+
},
|
|
292
|
+
'べき乗': { // @AのB乗を求める // @べきじょう
|
|
293
|
+
type: 'func',
|
|
294
|
+
josi: [['の'], ['の']],
|
|
295
|
+
pure: true,
|
|
296
|
+
fn: function (a, b) {
|
|
297
|
+
return Math.pow(a, b)
|
|
298
|
+
}
|
|
299
|
+
},
|
|
269
300
|
'以上': { // @AがB以上か // @いじょう
|
|
270
301
|
type: 'func',
|
|
271
302
|
josi: [['が'], ['']],
|
|
@@ -471,6 +502,7 @@ const PluginSystem = {
|
|
|
471
502
|
'ナデシコ': { // @なでしこのコードCODEを実行する // @なでしこする
|
|
472
503
|
type: 'func',
|
|
473
504
|
josi: [['を', 'で']],
|
|
505
|
+
pure: false,
|
|
474
506
|
fn: function (code, sys) {
|
|
475
507
|
if (sys.__genMode === '非同期モード') {
|
|
476
508
|
throw new Error('非同期モードでは「ナデシコ」は利用できません。')
|
|
@@ -2043,8 +2075,8 @@ const PluginSystem = {
|
|
|
2043
2075
|
'昨日': { // @昨日の日付を「YYYY/MM/DD」の形式で返す // @きのう
|
|
2044
2076
|
type: 'func',
|
|
2045
2077
|
josi: [],
|
|
2046
|
-
pure:
|
|
2047
|
-
fn: function () {
|
|
2078
|
+
pure: false,
|
|
2079
|
+
fn: function (sys) {
|
|
2048
2080
|
const t = Date.now() - (24 * 60 * 60 * 1000)
|
|
2049
2081
|
return sys.__formatDate(new Date(t))
|
|
2050
2082
|
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
const assert = require('assert')
|
|
2
|
+
const NakoDncl = require('../../src/nako_from_dncl')
|
|
3
|
+
const NakoCompiler = require('../../src/nako3')
|
|
4
|
+
|
|
5
|
+
describe('dncl (#1140)', () => {
|
|
6
|
+
const cmp = (src, expected) => {
|
|
7
|
+
src = NakoDncl.convert(src)
|
|
8
|
+
src = src.replace(/\s+$/, '')
|
|
9
|
+
expected = expected.replace(/\s+$/, '')
|
|
10
|
+
assert.strictEqual(src, expected)
|
|
11
|
+
}
|
|
12
|
+
const nako = new NakoCompiler()
|
|
13
|
+
const cmpNako = (code, res) => {
|
|
14
|
+
nako.logger.debug('code=' + code)
|
|
15
|
+
assert.strictEqual(nako.run(code).log, res)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
it('代入文', () => {
|
|
19
|
+
cmp('!DNCLモード\n'+
|
|
20
|
+
'A←3\n',
|
|
21
|
+
//---
|
|
22
|
+
'!DNCLモード\n'+
|
|
23
|
+
'A=3\n')
|
|
24
|
+
cmp('!DNCLモード\n'+
|
|
25
|
+
'A←3, B←5\n',
|
|
26
|
+
//---
|
|
27
|
+
'!DNCLモード\n'+
|
|
28
|
+
'A=3, B=5\n')
|
|
29
|
+
})
|
|
30
|
+
it('もし文', () => {
|
|
31
|
+
cmp('!DNCLモード\n'+
|
|
32
|
+
'もしA=5ならば\n「OK」と表示\nを実行する',
|
|
33
|
+
//---
|
|
34
|
+
'!DNCLモード\n'+
|
|
35
|
+
'もしA=5ならば\n「OK」と表示\nここまで')
|
|
36
|
+
})
|
|
37
|
+
// 実行テスト
|
|
38
|
+
it('簡単な実行テスト', () => {
|
|
39
|
+
cmpNako('!DNCLモード\nA←5,B←6,C←7。Cを表示する', '7')
|
|
40
|
+
cmpNako('!DNCLモード\nA=[]。A[1]=3;A[2]=3;Aの要素数を表示する', '2')
|
|
41
|
+
})
|
|
42
|
+
it('配列の入れ替え', () => {
|
|
43
|
+
cmpNako('!DNCLモード\nA={{11,12,13},{21,22,23}}。A[1,2]を表示する', '21')
|
|
44
|
+
cmpNako('!DNCLモード\nA={}。A[1]={11,12,13}, A[2]={21,22,23};A[2,1]を表示する', '12')
|
|
45
|
+
cmpNako('!DNCLモード\nA={{11,12,13},{21,22,23}}。B=A[3,2];Bを表示する', '23')
|
|
46
|
+
cmpNako('!DNCLモード\nA={{11,12,13},{21,22,23}}。C=2;AA=A[1+C,1];AAを表示', '13')
|
|
47
|
+
cmpNako('!DNCLモード\nA={{11,12,13},{21,22,23}}。X=2;Y=1;AA=A[X,Y+1];AAを表示', '22')
|
|
48
|
+
})
|
|
49
|
+
it('配列の自動初期化(#1143)', () => {
|
|
50
|
+
cmpNako('!DNCLモード\nA[1]←111。A[1]を表示する', '111')
|
|
51
|
+
cmpNako('!DNCLモード\nA[3,3]=3;A[3,3]を表示する', '3')
|
|
52
|
+
cmpNako('!DNCLモード\nA[3,2,1]=30;A[3,2,1]を表示する', '30')
|
|
53
|
+
cmpNako('!DNCLモード\nA[1,1]=11,A[1,2]=12;A[1,2]を表示する', '12')
|
|
54
|
+
})
|
|
55
|
+
it('インデントを|で表現する', () => {
|
|
56
|
+
cmpNako('!DNCLモード\nA=3;もしA>1ならば\n|A←A+1\nを実行する。\nAを表示する。', '4')
|
|
57
|
+
})
|
|
58
|
+
it('表示エミュレート', () => {
|
|
59
|
+
cmpNako('!DNCLモード\nx←10,y←20\nxと"-"とyを表示する。', '10-20')
|
|
60
|
+
cmpNako('!DNCLモード\nx←10,y←20\n"("とxと","とyと")"を表示する。', '(10,20)')
|
|
61
|
+
})
|
|
62
|
+
})
|
|
63
|
+
|
package/test/common/flow_test.js
CHANGED
|
@@ -356,5 +356,19 @@ describe('flow_test', () => {
|
|
|
356
356
|
cmp('A=3;もし、A=5あるいはA=3ならば「OK」と表示。違えば「NG」と表示。', 'OK')
|
|
357
357
|
cmp('A=空;B=3;もし(A=空)あるいは(B=空)ならば、"OK"と表示;違えば「NG」と表示。', 'OK')
|
|
358
358
|
})
|
|
359
|
+
it('「増繰り返す」「減繰り返す」を追加#1140', () => {
|
|
360
|
+
cmp('Nを0から4まで2ずつ増やし繰り返す\nNを表示\nここまで\n', '0\n2\n4')
|
|
361
|
+
cmp('A=2;Nを0から4までAずつ増やし繰り返す\nNを表示\nここまで\n', '0\n2\n4')
|
|
362
|
+
cmp('Nを4から0まで2ずつ減らし繰り返す\nNを表示\nここまで\n', '4\n2\n0')
|
|
363
|
+
})
|
|
364
|
+
it('「増やして繰り返す」「減らして繰り返す」を追加#1140', () => {
|
|
365
|
+
// トークンをスタックからポップして処理するので確認
|
|
366
|
+
cmp('Nを0から4まで2ずつ増やして繰り返す\nNを表示\nここまで\n', '0\n2\n4')
|
|
367
|
+
cmp('A=2;Nを0から4までAずつ増やして繰り返す\nNを表示\nここまで\n', '0\n2\n4')
|
|
368
|
+
cmp('Nを4から0まで2ずつ減らして繰り返す\nNを表示\nここまで\n', '4\n2\n0')
|
|
369
|
+
})
|
|
370
|
+
it('ならばの直前に空白があるとエラー(#1141)', () => {
|
|
371
|
+
cmp('A=30。もし、A>5 ならば、「OK」と表示。', 'OK')
|
|
372
|
+
})
|
|
359
373
|
})
|
|
360
374
|
|
|
@@ -582,4 +582,17 @@ describe('plugin_system_test', () => {
|
|
|
582
582
|
cmp('「2023/4/5 00:00:00」を「YYYYMMDD」で日時書式変換して表示', '20230405')
|
|
583
583
|
cmp('1640438681.025を「HH:mm:ss.ccc」で日時書式変換して表示', '22:24:41.025')
|
|
584
584
|
})
|
|
585
|
+
it('『昨日』の問題 #1124', () => {
|
|
586
|
+
cmp('昨日。もしそれが「」でなければ「OK」と表示', 'OK')
|
|
587
|
+
cmp('今日に「-1日」を日時加算してDに代入。昨日とDが等しい。もしそうならば「OK」と表示。', 'OK')
|
|
588
|
+
cmp('今日に「1日」を日時加算してDに代入。明日とDが等しい。もしそうならば「OK」と表示。', 'OK')
|
|
589
|
+
cmp('今月に1を足してDに代入。来月とDが等しい。もしそうならば「OK」と表示。', 'OK')
|
|
590
|
+
cmp('今月に-1を足してDに代入。先月とDが等しい。もしそうならば「OK」と表示。', 'OK')
|
|
591
|
+
cmp('今年に1を足してDに代入。来年とDが等しい。もしそうならば「OK」と表示。', 'OK')
|
|
592
|
+
cmp('今年に-1を足してDに代入。去年とDが等しい。もしそうならば「OK」と表示。', 'OK')
|
|
593
|
+
})
|
|
594
|
+
it('『二乗』 #1140', () => {
|
|
595
|
+
cmp('3の二乗を表示', '9')
|
|
596
|
+
cmp('2の3のべき乗を表示', '8')
|
|
597
|
+
})
|
|
585
598
|
})
|