Repository: syuilo/aiscript (ts)

Issue:
for文で初期値に対して処理が実行されない

Pull request:
fix bug of for syntax
<!-- ℹ お読みください
PRありがとうございます！ PRを作成する前に、以下をご確認ください:
- 可能であればタイトルに、以下で示すようなPRの種類が分かるキーワードをプリフィクスしてください。
  - fix / refactor / feat / enhance / perf / chore
  - また、PRの粒度が適切であることを確認してください。ひとつのPRに複数の種類の変更や関心を含めることは避けてください。
- このPRによって解決されるIssueがある場合は、そのIssueへの参照を本文内に含めてください。
- CHANGELOG.mdに変更点を追記してください。リファクタリングなど、利用者に影響を与えない変更についてはこの限りではありません。
- この変更により新たに作成、もしくは更新すべきドキュメントがないか確認してください。
- 機能追加やバグ修正をした場合は、可能であればテストケースを追加してください。
- テスト、Lintが通っていることを予め確認してください。
  - `npm run test`、`npm run lint`でぞれぞれ実施可能です
- `npm run api`を実行してAPIレポートを更新し、差分がある場合はコミットしてください。
ご協力ありがとうございます🤗
-->
<!-- ℹ README
Thank you for your PR! Before creating a PR, please check the following:
- If possible, prefix the title with a keyword that identifies the type of this PR, as shown below.
  - fix / refactor / feat / enhance / perf / chore
  - Also, make sure that the granularity of this PR is appropriate. Please do not include more than one type of change or interest in a single PR.
- If there is an Issue which will be resolved by this PR, please include a reference to the Issue in the text.
- Please add the summary of the changes to CHANGELOG.md. However, this is not necessary for changes that do not affect the users, such as refactoring.
- Check if there are any documents that need to be created or updated due to this change.
- If you have added a feature or fixed a bug, please add a test case if possible.
- Please make sure that tests and Lint are passed in advance.
  - You can run it with `npm run test` and `npm run lint`.
- Run `npm run api` to update the API report and commit it if there are any diffs.
Thanks for your cooperation 🤗
-->

# What
<!-- このPRで何をしたのか？ どう変わるのか？ -->
<!-- What did you do with this PR? How will it change things? -->
Resolve #202 

# Why
<!-- なぜそうするのか？ どういう意図なのか？ 何が困っているのか？ -->
<!-- Why do you do it? What are your intentions? What is the problem? -->

# Additional info (optional)
<!-- テスト観点など -->
<!-- Test perspective, etc -->


Patch:
diff --git a/src/interpreter/index.ts b/src/interpreter/index.ts
index 31b822a..f56fb6d 100644
--- a/src/interpreter/index.ts
+++ b/src/interpreter/index.ts
@@ -246,7 +246,7 @@ export class Interpreter {
 				if (node.times) {
 					const times = await this._eval(node.times, scope);
 					assertNumber(times);
-					for (let i = 1; i < times.value + 1; i++) {
+					for (let i = 0; i < times.value; i++) {
 						const v = await this._eval(node.for, scope);
 						if (v.type === 'break') {
 							break;
@@ -259,7 +259,7 @@ export class Interpreter {
 					const to = await this._eval(node.to!, scope);
 					assertNumber(from);
 					assertNumber(to);
-					for (let i = from.value + 1; i < to.value + 1; i++) {
+					for (let i = from.value; i < from.value + to.value; i++) {
 						const v = await this._eval(node.for, scope.createChildScope(new Map([
 							[node.var!, NUM(i)],
 						])));


Test patch:
diff --git a/test/index.ts b/test/index.ts
index 6cb4677..78fa755 100644
--- a/test/index.ts
+++ b/test/index.ts
@@ -867,7 +867,7 @@ describe('chain', () => {
 		}
 		<: x.count
 		`);
-		eq(res, NUM(55));
+		eq(res, NUM(45));
 	});
 });
 
@@ -1041,7 +1041,7 @@ describe('Return', () => {
 		}
 		<: f()
 		`);
-		eq(res, NUM(42));
+		eq(res, NUM(43));
 	});
 
 	it('return inside loop', async () => {
@@ -1286,13 +1286,24 @@ describe('for', () => {
 		const res = await exe(`
 		var count = 0
 		for (let i, 10) {
-			count = (count + i)
+			count += i + 1
 		}
 		<: count
 		`);
 		eq(res, NUM(55));
 	});
 
+	it('initial value', async () => {
+		const res = await exe(`
+		var count = 0
+		for (let i = 2, 10) {
+			count += i
+		}
+		<: count
+		`);
+		eq(res, NUM(65));
+	});
+
 	it('wuthout iterator', async () => {
 		const res = await exe(`
 		var count = 0
@@ -1312,7 +1323,7 @@ describe('for', () => {
 		}
 		<: count
 		`);
-		eq(res, NUM(55));
+		eq(res, NUM(45));
 	});
 
 	it('Break', async () => {
@@ -1320,7 +1331,7 @@ describe('for', () => {
 		var count = 0
 		for (let i, 20) {
 			if (i == 11) break
-			count = (count + i)
+			count += i
 		}
 		<: count
 		`);
@@ -2317,7 +2328,7 @@ describe('extra', () => {
 	it('Fizz Buzz', async () => {
 		const res = await exe(`
 		let res = []
-		for (let i, 15) {
+		for (let i = 1, 15) {
 			let msg =
 				if (i % 15 == 0) "FizzBuzz"
 				elif (i % 3 == 0) "Fizz"