From e97b433e3fd0176badda12f650f87154e29c831a Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Wed, 20 Mar 2024 14:57:51 +0900 Subject: [PATCH 1/5] Update primitive-props.ts --- src/interpreter/primitive-props.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/interpreter/primitive-props.ts b/src/interpreter/primitive-props.ts index 911313ac..443125fc 100644 --- a/src/interpreter/primitive-props.ts +++ b/src/interpreter/primitive-props.ts @@ -183,6 +183,7 @@ const PRIMITIVE_PROPS: { reduce: (target: VArr): VFn => FN_NATIVE(async ([fn, initialValue], opts) => { assertFunction(fn); const withInitialValue = initialValue != null; + if (!withInitialValue && (target.value.length === 0)) throw new AiScriptRuntimeError('Reduce of empty array without initial value'); let accumulator = withInitialValue ? initialValue : target.value[0]!; for (let i = withInitialValue ? 0 : 1; i < target.value.length; i++) { const item = target.value[i]!; From 7c93eea906a5eafdd09222c2ba06fa281f849e83 Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Wed, 20 Mar 2024 15:36:50 +0900 Subject: [PATCH 2/5] Update index.ts --- test/index.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/test/index.ts b/test/index.ts index 3c62c840..000ef6d9 100644 --- a/test/index.ts +++ b/test/index.ts @@ -4,6 +4,7 @@ */ import * as assert from 'assert'; +import { expect, test } from '@jest/globals'; import { Parser, Interpreter, utils, errors, Ast } from '../src'; import { NUM, STR, NULL, ARR, OBJ, BOOL, TRUE, FALSE, ERROR ,FN_NATIVE } from '../src/interpreter/value'; let { AiScriptRuntimeError, AiScriptIndexOutOfRangeError } = errors; @@ -2694,8 +2695,15 @@ describe('primitive props', () => { eq(res, NUM(20)); }); + test.concurrent('reduce of empty array without initial value', async () => { + await expect(exe(` + let arr = [1, 2, 3, 4] + <: [].reduce(@(){}) + `)).rejects.toThrow('Reduce of empty array without initial value'); + }); + test.concurrent('find', async () => { - const res = await exe(` + await exe(` let arr = ["abc", "def", "ghi"] <: arr.find(@(item) { item.incl("e") }) `); From 7c008c6cff2298e066b15257caefc243071c05d8 Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Wed, 20 Mar 2024 15:41:08 +0900 Subject: [PATCH 3/5] fix --- test/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/index.ts b/test/index.ts index 000ef6d9..d5a6b87f 100644 --- a/test/index.ts +++ b/test/index.ts @@ -2703,7 +2703,7 @@ describe('primitive props', () => { }); test.concurrent('find', async () => { - await exe(` + const res = await exe(` let arr = ["abc", "def", "ghi"] <: arr.find(@(item) { item.incl("e") }) `); From 2a4cc694ecf39f8ee1f33859c6a32345144390ef Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Wed, 20 Mar 2024 15:48:50 +0900 Subject: [PATCH 4/5] Update primitive-props.md --- docs/primitive-props.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/primitive-props.md b/docs/primitive-props.md index 0c9c2919..42de63f9 100644 --- a/docs/primitive-props.md +++ b/docs/primitive-props.md @@ -140,11 +140,13 @@ _i_ 番目の文字が存在しない場合は null が返されます。 配列の要素のうち _func_ が true を返すようなもののみを抜き出して返します。 順序は維持されます。 -### @(_v_: arr).reduce(_func_: @(_acm_: value, _item_: value, _index_: num) { value }, _initial_: value): value +### @(_v_: arr).reduce(_func_: Callback, _initial_: value): value +`Callback`: @(_acm_: value, _item_: value, _index_: num): value 配列の各要素に対し _func_ を順番に呼び出します。 各呼び出しでは、前回の結果が第1引数 _acm_ として渡されます。 _initial_ が指定された場合は初回呼び出しの引数が(_initial_, _v_\[0], 0)、 指定されなかった場合は(_v_\[0], _v_\[1], 1)となります。 +配列が空配列であり、かつ _initial_ が指定されていない場合はエラーになります。従って基本的には _initial_ を指定しておくことが推奨されています。 ### @(_v_: arr).find(_func_: @(_item_: value, _index_: num) { bool }): value 配列から _func_ が true を返すような要素を探し、その値を返します。 From ded9d7fe0e5df742e29582a51169b11df502d03b Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Wed, 20 Mar 2024 15:55:07 +0900 Subject: [PATCH 5/5] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a54dd98..2c1f836d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - `arr.incl`の引数の型制限を廃止 - `Date:millisecond`を追加 - `arr.fill`, `arr.repeat`, `Arr:create`を追加 +- `arr.reduce`が空配列に対して初期値なしで呼び出された時、正式にエラーを出すように # 0.17.0 - `package.json`を修正