From bc684413d6781090f1dd115ec6184eeff82a255d Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Sat, 4 Nov 2023 21:59:56 +0900 Subject: [PATCH 01/26] Update primitive-props.md --- docs/primitive-props.md | 76 +++++++++++++++++++++++++++++------------ 1 file changed, 55 insertions(+), 21 deletions(-) diff --git a/docs/primitive-props.md b/docs/primitive-props.md index bb72aae6..95fd1d04 100644 --- a/docs/primitive-props.md +++ b/docs/primitive-props.md @@ -1,5 +1,7 @@ -プリミティブ値とは値の型ごとに用意された特殊な値あるいは関数です。 -特定の型の値の後に`.`に続けてプリミティブ値名を記述することで呼び出すことができます。 +[Read translated version (en)](../translations/en/docs/primitive-props.md) + +プリミティブプロパティとは、特定の型の値向けに用意された特殊な値あるいは関数です。 +オブジェクトのプロパティのように`.`の記法で呼び出すことができます。(`[]`の記法は使えません) ```js // 例 'ai kawaii'.len //9 @@ -9,16 +11,17 @@ Core:range(0,2).push(4) //[0,1,2,4] 今の所、数値・文字列・配列・エラー型に対応するものが用意されています。オブジェクトのそれに相当するものは、記法との兼ね合いで[std関数](std.md#-obj)として実装されています。 ## 書式 -> #(_v_: 型名).プリミティブ値名 - -\#から始まるものは関数でないプリミティブ値です。 -> @(_v_: 型名).プリミティブ関数名(引数リスト): 返り値の型 +本ページでは、(型名)型の任意の値に対するプリミティブプロパティを下記のような形式で表記します。 +> #(_v_: 型名).プロパティ名 +> // または +> @(_v_: 型名).プリミティブ関数名(引数リスト): 返り値の型 -\@から始まるものはプリミティブ関数です。 +\#から始まるものは関数以外の値を持つプリミティブプロパティです。 +\@から始まるものは関数のプリミティブプロパティ(プリミティブ関数)です。 ## 数値 ### @(_x_: num).to_str(): str -値を表す文字列を取得します。 +数値を文字列に変換します。 ## 文字列 @@ -27,31 +30,39 @@ Core:range(0,2).push(4) //[0,1,2,4] 文字列の長さを取得します。 ### @(_v_: str).to_num(): num | null -値を表す数値を取得します。 +文字列が数字であれば、数値に変換します。 ### @(_v_: str).pick(_i_: num): str | null +文字列中の _i_ 番目の文字を取得します。 ### @(_v_: str).incl(_keyword_: str): bool +文字列中に _keyword_ が含まれていれば`true`、なければ`false`を返します。 ### @(_v_: str).slice(_begin_: num, _end_: num): str -文字列の指定した部分を取得します。 +文字列の _begin_ 番目から _end_ 番目の直前までの部分を取得します。 ### @(_v_: str).split(_splitter_?: str): arr +文字列を _splitter_ がある場所で区切り、配列にしたものを返します。 +_splitter_ が与えられなければ一文字づつ区切ります。 -### @(_v_: str).replace( _old_: str, _new_: str): str +### @(_v_: str).replace(_old_: str, _new_: str): str +文字列中の _old_ を _new_ に置換したものを返します。 ### @(_v_: str).index_of(_search_: str): num +文字列中から _search_ を検索し、あれば何文字に存在したかを、なければ-1を返します。 ### @(_v_: str).trim(): str +文字列の前後の空白を取り除いたものを返します。 ### @(_v_: str).upper(): str +文字列中の英字を大文字に変換して返します。 ### @(_v_: str).lower(): str +文字列中の英字を小文字に変換して返します。 ### @(_v_: str).codepoint_at(_i_: num): num | null -インデックスにある文字のコードポイントを取得します。 - -文字が存在しない場合は null が返されます。 +_i_ 番目の文字の[コードポイント](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt)を取得します。 +_i_ 番目の文字が存在しない場合は null が返されます。 ## 配列 @@ -60,14 +71,20 @@ Core:range(0,2).push(4) //[0,1,2,4] 配列の要素数を取得します。 ### @(_v_: arr).push(_i_: value): null +**Modifying** 配列の最後に要素を追加します。 ### @(_v_: arr).unshift(i: value): null +**Modifying** +配列の最初に要素を追加します。 ### @(_v_: arr).pop(): value +**Modifying** 配列の最後の要素を取り出します。 ### @(_v_: arr).shift(): value +**Modifying** +配列の最初の要素を取り出します。 ### @(_a_: arr).concat(_b_: arr): arr 配列を連結します。 @@ -76,27 +93,44 @@ Core:range(0,2).push(4) //[0,1,2,4] 文字列の配列を結合して一つの文字列として返します。 ### @(_v_: arr).slice(_begin_: num, _end_: num): arr +配列の _begin_ 番目から _end_ 番目の部分を切り出して返します。 ### @(_v_: arr).incl(_i_: str | num | bool | null): bool 配列に指定した値が含まれているかどうかを返します。 -### @(_v_: arr).map(_f_: fn): arr +### @(_v_: arr).map(_func_: fn): arr +配列の各要素に対し _func_ を非同期的に呼び出します。 +それぞれの要素を _func_ の返り値で置き換えたものを返します。 -### @(_v_: arr).filter(_f_: fn): arr +### @(_v_: arr).filter(_func_: fn): arr +配列の要素のうち _func_ が true を返すようなもののみを抜き出して返します。 +順序は維持されます。 -### @(_v_: arr).reduce(_f_: @(_acm_: value, _item_: value, _index_: num) { value }, _initial_: value): value +### @(_v_: arr).reduce(_func_: @(_acm_: value, _item_: value, _index_: num) { value }, _initial_: value): value +配列の各要素に対し _func_ を順番に呼び出します。 +各呼び出しでは、前回の結果が第1引数 _acm_ として渡されます。 +_initial_ が指定された場合は初回呼び出しの引数が(_initial_, _v_\[0], 0)、 +指定されなかった場合は(_v_\[0], _v_\[1], 1)となります。 -### @(_v_: arr).find(_f_: @(_item_: value, _index_: num) { bool }): value -配列から要素を探します。 +### @(_v_: arr).find(_func_: @(_item_: value, _index_: num) { bool }): value +配列から _func_ が true を返すような要素を探し、その値を返します。 ### @(_v_: arr).reverse(): null +**Modifying** 配列を反転させます。 ### @(_v_: arr).copy(): arr 配列のコピーを生成します。 -### @(_v_: arr).sort(comp: @(a: value, b: value)): arr -配列をソートします。compにはStr:lt, Str:gtと同様のnumを返す比較関数を渡します。 +### @(_v_: arr).sort(_comp_: @(_a_: value, _b_: value)): arr +**Modifying** +配列の並べ替えをします。第1引数 _comp_ として次のような比較関数を渡します。 +* _a_ が _b_ より順番的に前の時、負の値を返す +* _a_ が _b_ より順番的に後の時、正の値を返す +* _a_ が _b_ と順番的に同等の時、0を返す + +数値の並び替えでは`Core:sub`を渡すことで昇順、`@(a,b){b-a}`を渡すことで降順ソートができます。 +文字列用の比較関数として`Str:lt`(昇順), `Str:gt`(降順)が用意されています。詳しくは[std.md](std.md#-str)をご覧下さい。 ## エラー型 ### #(_v_: error).name From 74e327831a2b0b5cc18f93066334aeba35cf6fdc Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Sat, 4 Nov 2023 22:33:54 +0900 Subject: [PATCH 02/26] Create keywords.md --- docs/keywords.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 docs/keywords.md diff --git a/docs/keywords.md b/docs/keywords.md new file mode 100644 index 00000000..3edd5338 --- /dev/null +++ b/docs/keywords.md @@ -0,0 +1,23 @@ +## 予約語について +AiScriptにおける予約語とは、変数や関数の名前として使用することが禁止されている単語のことを言います。 +使用するとSyntax Errorとなります。 +``` +// matchとforは予約語 +let match=null // エラー +@for(){ print('hoge')} // エラー +``` + +## 使用中の語と使用予定の語 +`match`や`for`は文法中で既にキーワードとして使用されています。 +もしこれらが変数名として使用されると、プログラムの見た目が紛らわしいものになるだけでなく、文法解析上のコストが増加します。 +ゆえに文法中のキーワードは基本的に全て予約語となっています。 +一方で、いくつかの単語は文法中に存在しないにも関わらず予約語となっています。 +これは将来文法が拡張された時に使用される可能性を見越してのものです。 + +## 一覧 +以下の単語が予約語として登録されています。 +### 使用中の語 +`null`, `true`, `false`, `each`, `for`, `loop`, `break`, `continue`, `match`, `if`, `elif`, `else`, `return`, `eval`, `var`, `let`, `exists` + +### 使用予定の語 +`fn`, `namespace`, `meta`, `attr`, `attribute`, `static`, `class`, `struct`, `module`, `while`, `import`, `export` From fcb489eaccf01ed03f0065879312c04a679d5ebd Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Sat, 4 Nov 2023 22:46:20 +0900 Subject: [PATCH 03/26] Update keywords.md --- docs/keywords.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/keywords.md b/docs/keywords.md index 3edd5338..adb024fa 100644 --- a/docs/keywords.md +++ b/docs/keywords.md @@ -1,6 +1,6 @@ ## 予約語について -AiScriptにおける予約語とは、変数や関数の名前として使用することが禁止されている単語のことを言います。 -使用するとSyntax Errorとなります。 +AiScriptにおける予約語とは、変数や関数の名前として使用することが禁止されている単語のことを言います。 +使用するとSyntax Errorとなります。 ``` // matchとforは予約語 let match=null // エラー @@ -8,14 +8,14 @@ let match=null // エラー ``` ## 使用中の語と使用予定の語 -`match`や`for`は文法中で既にキーワードとして使用されています。 -もしこれらが変数名として使用されると、プログラムの見た目が紛らわしいものになるだけでなく、文法解析上のコストが増加します。 -ゆえに文法中のキーワードは基本的に全て予約語となっています。 -一方で、いくつかの単語は文法中に存在しないにも関わらず予約語となっています。 -これは将来文法が拡張された時に使用される可能性を見越してのものです。 +`match`や`for`は文法中で既にキーワードとして使用されています。 +もしこれらが変数名として使用されると、プログラムの見た目が紛らわしいものになるだけでなく、文法解析上のコストが増加します。 +ゆえに文法中のキーワードは基本的に全て予約語となっています。 +一方で、いくつかの単語は文法中に存在しないにも関わらず予約語となっています。 +これは将来文法が拡張された時に使用される可能性を見越してのものです。 ## 一覧 -以下の単語が予約語として登録されています。 +以下の単語が予約語として登録されています。 ### 使用中の語 `null`, `true`, `false`, `each`, `for`, `loop`, `break`, `continue`, `match`, `if`, `elif`, `else`, `return`, `eval`, `var`, `let`, `exists` From 97d28ab715ed5766a008413ee71cc818a678a162 Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Sat, 4 Nov 2023 22:47:15 +0900 Subject: [PATCH 04/26] Update keywords.md --- docs/keywords.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/keywords.md b/docs/keywords.md index adb024fa..0e2b71de 100644 --- a/docs/keywords.md +++ b/docs/keywords.md @@ -11,6 +11,7 @@ let match=null // エラー `match`や`for`は文法中で既にキーワードとして使用されています。 もしこれらが変数名として使用されると、プログラムの見た目が紛らわしいものになるだけでなく、文法解析上のコストが増加します。 ゆえに文法中のキーワードは基本的に全て予約語となっています。 + 一方で、いくつかの単語は文法中に存在しないにも関わらず予約語となっています。 これは将来文法が拡張された時に使用される可能性を見越してのものです。 From 3d621f07fe1d29188d302b01e51fbcfbc45050f5 Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Sat, 4 Nov 2023 22:47:50 +0900 Subject: [PATCH 05/26] Update syntax.md --- docs/syntax.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/syntax.md b/docs/syntax.md index ed21880a..73bc3563 100644 --- a/docs/syntax.md +++ b/docs/syntax.md @@ -14,9 +14,16 @@ ## 変数宣言 ``` +// イミュータブル(代入不可) let answer = 42 +// ミュータブル(代入可能) +var answer2 = 57 ``` +## 予約語について +変数や関数の宣言において、名前として使用できないキーワードがいくつかあります。 +詳しくは[keywords.md](./keywords.md)を参照ください。 + ## if ``` if answer == 42 { From 53060f449af3543843aad4e6958a153af339e208 Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Sun, 5 Nov 2023 12:06:13 +0900 Subject: [PATCH 06/26] Update syntax.md --- docs/syntax.md | 116 +++++++++++++++++++++++++++++-------------------- 1 file changed, 69 insertions(+), 47 deletions(-) diff --git a/docs/syntax.md b/docs/syntax.md index 73bc3563..40ef9f13 100644 --- a/docs/syntax.md +++ b/docs/syntax.md @@ -5,71 +5,102 @@ ## コメント `//`で始めた行や`/*` `*/`で囲んだ箇所はコメントになり、プログラムの動作に影響を与えません。 -``` +```js // this is a comment /* this is a comment too */ ``` -## 変数宣言 -``` -// イミュータブル(代入不可) +## 変数・関数宣言 +イミュータブル変数(定数)には`let`、ミュータブル変数には`var`、関数には`@`を使用します。 +### 予約語について +変数や関数の宣言において、名前として使用できないキーワードがいくつかあります。 +詳しくは[keywords.md](./keywords.md)を参照ください。 +### 変数 +```js +// イミュータブル(再代入不可) let answer = 42 -// ミュータブル(代入可能) +// ミュータブル(再代入可能) var answer2 = 57 ``` - -## 予約語について -変数や関数の宣言において、名前として使用できないキーワードがいくつかあります。 -詳しくは[keywords.md](./keywords.md)を参照ください。 - -## if +```js +// 初期値の省略は不可 +var answer // Syntax Error +// match等の予約語は変数名として使用できない +let match = 12 // Syntax Error ``` -if answer == 42 { - <: "correct answer" +### 関数 +```js +// 最後の式が暗黙にreturnされる +@add(x, y) { + x + y +} +<: add(1, 2) // 3 +// 明示的にreturnを書くこともできる +@add2(x, y) { + return x + y +} +<: add(1, 2) // 3 +// 引数を複数行で書いてもよい +@add3( + x, + y +) { + x + y +} +@add4(x,y){x+y} // ワンライナー +// 無名関数は式として使用可能 +let add5 = @(x, y) { + x + y } ``` - -### else: -``` -if answer == 42 { - <: "correct answer" -} else { - <: "wrong answer" +```js +// match等の予約語は関数名として使用できない +@match(x, y){ // Syntax Error + x == y +} +// 最後の引数の後にはコロンを付けられない +@add(x, y,) { // Syntax Error + x + y } ``` -### else if: -``` -if answer == "bebeyo" { +## if +```js +// 単行 +if answer == 42 print("correct answer") +// 複数行 +if answer == 42 { <: "correct answer" +} +// 式として使用可能( +<: `{if answer == 42 "collect answer"}` +// else, elifも使用可能 +let result = if answer == "bebeyo" { + "correct answer" } elif answer == "ai" { - <: "kawaii" + "kawaii" } else { - <: "wrong answer" + "wrong answer" } +// elseがない場合、条件式がfalseならnullを返す +<: if false 1 // null ``` - -### as expression: -``` -let result = - if answer == "bebeyo" { "correct answer" } - elif answer == "ai" { "kawaii" } - else { "wrong answer" } - -<: result +```js +// ifの直後の空白は必須 +if(true) return 1// Syntax Error ``` ## for -``` +```js for let i, 10 { <: i } ``` ## Block -``` +```js let foo = eval { let x = 1 let y = 2 @@ -79,17 +110,8 @@ let foo = eval { <: foo // 3 ``` -## Function -``` -@inc(x) { - x + 1 -} - -<: inc(42) // 43 -``` - ## match -``` +```js let x = 1 let y = match x { 1 => "yes" @@ -100,7 +122,7 @@ let y = match x { ``` ## exists -``` +```js let foo = exists bar let bar = exists foo From 44feebe170903392a622246d93b6c66ed5a92bfc Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Wed, 8 Nov 2023 21:08:05 +0900 Subject: [PATCH 07/26] Update syntax.md --- docs/syntax.md | 63 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 17 deletions(-) diff --git a/docs/syntax.md b/docs/syntax.md index 40ef9f13..a3b9e31e 100644 --- a/docs/syntax.md +++ b/docs/syntax.md @@ -6,12 +6,19 @@ `//`で始めた行や`/*` `*/`で囲んだ箇所はコメントになり、プログラムの動作に影響を与えません。 ```js -// this is a comment +// 単行コメント /* - this is a comment too + 複数行コメント */ ``` +## バージョンアノテーション +プログラムの一行目に以下の記法を行うことで、想定されたAiScriptのバージョンを明記することができます。 +このバージョンはホストプログラムによって読み込まれる場合があります。 +```js +/// @ 0.16.0 +``` + ## 変数・関数宣言 イミュータブル変数(定数)には`let`、ミュータブル変数には`var`、関数には`@`を使用します。 ### 予約語について @@ -29,44 +36,56 @@ var answer2 = 57 var answer // Syntax Error // match等の予約語は変数名として使用できない let match = 12 // Syntax Error +// 同名の変数の再宣言は禁止 +var a = 1 +var a = 2 // Runtime Error +let a = 3 // Runtime Error ``` ### 関数 +関数宣言はイミュータブル変数を関数で初期化するのと同じ動作になっています。 ```js // 最後の式が暗黙にreturnされる @add(x, y) { x + y } <: add(1, 2) // 3 +// 定数をリテラル関数で初期化しても同じ働きになる +let add2 = @(x, y) { + x + y +} // 明示的にreturnを書くこともできる -@add2(x, y) { +@add3(x, y) { return x + y } -<: add(1, 2) // 3 // 引数を複数行で書いてもよい -@add3( +@add4( x, y ) { x + y } -@add4(x,y){x+y} // ワンライナー -// 無名関数は式として使用可能 -let add5 = @(x, y) { - x + y -} +@add5(x,y){x+y} // ワンライナー ``` ```js // match等の予約語は関数名として使用できない -@match(x, y){ // Syntax Error +@match(x, y) { // Syntax Error x == y } // 最後の引数の後にはコロンを付けられない @add(x, y,) { // Syntax Error x + y } +// 変数同様再宣言は不可 +var func = null +@func() { // Runtime Error + 'hoge' +} ``` ## if +キーワード`if`に続く式がtrueに評価されるかfalseに評価されるかで条件分岐を行います。 +`if`の直後に1つ以上の空白またはタブを挟む必要があります。(改行があっても) +`bool`型ではない値に評価されるとエラーになります。 ```js // 単行 if answer == 42 print("correct answer") @@ -99,7 +118,17 @@ for let i, 10 { } ``` -## Block +## each +``` +let arr = ['chan', 'kun', 'sama'] +each let v, arr { + <: v +} +``` + +## eval +別名ブロック式。 +`{ }`内の文を順次評価し、最後の文の値を返します。 ```js let foo = eval { let x = 1 @@ -122,10 +151,10 @@ let y = match x { ``` ## exists +与えられた名称の変数または関数が存在すればtrue、しなければfalseを返します。 ```js -let foo = exists bar -let bar = exists foo - -<: foo //false -<: bar //true +// 変数barは存在しないためfalse +var foo = exists bar +// 変数fooが存在するためtrue +var bar = exists foo ``` From 7ec26b1097d276b8b94426661a7cf9f2c49f713f Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Fri, 10 Nov 2023 01:14:23 +0900 Subject: [PATCH 08/26] Update syntax.md --- docs/syntax.md | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/docs/syntax.md b/docs/syntax.md index a3b9e31e..3aa91348 100644 --- a/docs/syntax.md +++ b/docs/syntax.md @@ -12,9 +12,9 @@ */ ``` -## バージョンアノテーション +## バージョン表記 プログラムの一行目に以下の記法を行うことで、想定されたAiScriptのバージョンを明記することができます。 -このバージョンはホストプログラムによって読み込まれる場合があります。 +このバージョンはホストプログラムによって読み込まれる場合があります。 ```js /// @ 0.16.0 ``` @@ -42,7 +42,7 @@ var a = 2 // Runtime Error let a = 3 // Runtime Error ``` ### 関数 -関数宣言はイミュータブル変数を関数で初期化するのと同じ動作になっています。 +関数宣言はイミュータブル変数を関数で初期化するのと同じ動作になっています。 ```js // 最後の式が暗黙にreturnされる @add(x, y) { @@ -83,9 +83,9 @@ var func = null ``` ## if -キーワード`if`に続く式がtrueに評価されるかfalseに評価されるかで条件分岐を行います。 -`if`の直後に1つ以上の空白またはタブを挟む必要があります。(改行があっても) -`bool`型ではない値に評価されるとエラーになります。 +キーワード`if`に続く式がtrueに評価されるかfalseに評価されるかで条件分岐を行います。 +`if`の直後に1つ以上の空白またはタブを挟む必要があります。(改行があっても) +`bool`型ではない値に評価されるとエラーになります。 ```js // 単行 if answer == 42 print("correct answer") @@ -158,3 +158,23 @@ var foo = exists bar // 変数fooが存在するためtrue var bar = exists foo ``` + +## テンプレート構文 +変数や式を埋め込んだ文字列を作成するための構文です。 +全体を`` ` ` ``で囲い、式を埋め込む場所は`{ }`で囲います。 +``` +let ai = "kawaii" +<: `Hello, {ai} world!` +// 結果: Hello, kawaii world! +``` + +## メタデータ +AiScriptファイルにメタデータを埋め込める機能です。 +メタデータはホストプログラムによって読まれる場合があります。 +``` +### { + name: "example" + version: 42 + keywords: ["foo" "bar" "baz"] +} +``` From 1582b2dfd8c79be6313e398d6ce0c3223af32638 Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Fri, 10 Nov 2023 01:16:05 +0900 Subject: [PATCH 09/26] Create literals.md --- docs/literals.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 docs/literals.md diff --git a/docs/literals.md b/docs/literals.md new file mode 100644 index 00000000..4f690183 --- /dev/null +++ b/docs/literals.md @@ -0,0 +1,29 @@ +## リテラル +AiScriptにおけるリテラルとは、スクリプト上で値をそのまま書き表すことのできる表記法です。 +null、真理値、数値、文字列、オブジェクト、関数をサポートしています。 + +### null +``` +null +``` + +### 真理値 +``` +true +false +``` + +### 数値 +十進以外の記数法はサポートされていません。 +``` +12 // 自然数 +-34 // 負数 +52.448 // 少数 +``` + +### 文字列 +`'`または`"`が使用可能であり、解釈上の違いはありません。 +リテラルではありませんが、`` ` ``を使用することで文中に式を含むことができるテンプレート構文が使用できます。→[syntax.md](./syntax.md#%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E6%A7%8B%E6%96%87) +``` + +``` From 7a6ef255ab730092d3504981b2368eaae717e76e Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Fri, 10 Nov 2023 01:29:59 +0900 Subject: [PATCH 10/26] Update get-started.md --- docs/get-started.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/get-started.md b/docs/get-started.md index f23eadea..d1783936 100644 --- a/docs/get-started.md +++ b/docs/get-started.md @@ -158,7 +158,7 @@ let foo = eval { AiScriptでの条件分岐は、次のように書きます: ``` if (a == b) { - <: "a is equal to b" + <: "a equals to b" } ``` @@ -166,18 +166,18 @@ if (a == b) { then節の後に`else`を書き、さらに式を追加することで条件に一致しなかった場合の処理も行うことが出来ます: ``` if (a == b) { - <: "a is equal to b" + <: "a equals to b" } else { - <: "a is not equal to b" + <: "a does not equal to b" } ``` `elif`の後に条件式を書くことで条件判定を複数行うことも出来ます: ``` if (a == b) { - <: "a is equal to b" + <: "a equals to b" } elif (a > b) { - <: "a is grater than b" + <: "a is greater than b" } else { <: "a is less than b" } @@ -186,9 +186,9 @@ if (a == b) { これらの条件分岐は式なので、ブロック内で値を返せます: ``` <: if (a == b) { - "a is equal to b" + "a equals to b" } elif (a > b) { - "a is grater than b" + "a is greater than b" } else { "a is less than b" } From 7ccd83581104487e0e61895d56a5ccd17106ba9e Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Fri, 10 Nov 2023 01:53:49 +0900 Subject: [PATCH 11/26] Update syntax.md --- docs/syntax.md | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/docs/syntax.md b/docs/syntax.md index 3aa91348..5dbe7801 100644 --- a/docs/syntax.md +++ b/docs/syntax.md @@ -162,16 +162,27 @@ var bar = exists foo ## テンプレート構文 変数や式を埋め込んだ文字列を作成するための構文です。 全体を`` ` ` ``で囲い、式を埋め込む場所は`{ }`で囲います。 +式の値が文字列でない場合は、[Core:to_str](./std.md)と同じ方法で文字列に変換されます。 +```js +<: `Ai chan is No.{ 2-1 }` // Ai chan is No.1 +// 改行可 一行にしたい場合は{ Str:lf }を使う +`This statement is { true }. +Previous statement is { !true }.` +// \を前置することで`、{、}、をエスケープできる +`\` \{ \}` // ` { } ``` -let ai = "kawaii" -<: `Hello, {ai} world!` -// 結果: Hello, kawaii world! +```js +// { }の中身が空であってはならない({ }を文字列として使いたい場合はエスケープすること) +`Everything is { } here.` // Syntax Error +// 式の前後で改行をしてはならない(式中で改行するのは可) +`Oops, something went { // Syntax Error + 'wrong' +}!` ``` - ## メタデータ AiScriptファイルにメタデータを埋め込める機能です。 メタデータはホストプログラムによって読まれる場合があります。 -``` +```js ### { name: "example" version: 42 From 564cdc9459a3afab8ded4e633b0d55b06c1dd2b0 Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Fri, 10 Nov 2023 02:15:41 +0900 Subject: [PATCH 12/26] Update literals.md --- docs/literals.md | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/docs/literals.md b/docs/literals.md index 4f690183..b3abef20 100644 --- a/docs/literals.md +++ b/docs/literals.md @@ -3,19 +3,19 @@ AiScriptにおけるリテラルとは、スクリプト上で値をそのまま null、真理値、数値、文字列、オブジェクト、関数をサポートしています。 ### null -``` +```js null ``` ### 真理値 -``` +```js true false ``` ### 数値 十進以外の記数法はサポートされていません。 -``` +```js 12 // 自然数 -34 // 負数 52.448 // 少数 @@ -23,7 +23,31 @@ false ### 文字列 `'`または`"`が使用可能であり、解釈上の違いはありません。 -リテラルではありませんが、`` ` ``を使用することで文中に式を含むことができるテンプレート構文が使用できます。→[syntax.md](./syntax.md#%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E6%A7%8B%E6%96%87) +リテラルではありませんが、`` ` ``を使用することで文中に式を含むことができるテンプレート構文があります。→[syntax.md](./syntax.md#%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E6%A7%8B%E6%96%87) +```js +'ここでは"を文字列に含むことができます' +"ここでは'を文字列に含むことができます" +'エスケープすれば\'を含むことができます' +"エスケープすれば\"を含むことができます" +'改行 +できます' +"改行 // ここにコメントを書くと文字列の一部になります +できます" // ここは問題なし ``` +## 配列 +```js +[] // 空の配列 +[1 2 3] // 空白で区切る +[1, 2, 3] // ,で区切ることも出来る +[ // 改行可 + 1, + 2, + 3, // 最後の項に,をつけてもよい +] ``` + +## オブジェクト +## 関数 +## エラー型 +エラー型のリテラルはありませんが、[Error:create](./std.md)で値を作ることができます。 From 896b0123ab8427c943f7c24493a79f4443cf9a82 Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Fri, 10 Nov 2023 02:20:21 +0900 Subject: [PATCH 13/26] Update syntax.md --- docs/syntax.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/syntax.md b/docs/syntax.md index 5dbe7801..f864e531 100644 --- a/docs/syntax.md +++ b/docs/syntax.md @@ -175,9 +175,9 @@ Previous statement is { !true }.` // { }の中身が空であってはならない({ }を文字列として使いたい場合はエスケープすること) `Everything is { } here.` // Syntax Error // 式の前後で改行をしてはならない(式中で改行するのは可) -`Oops, something went { // Syntax Error +`Oops, something went { 'wrong' -}!` +}!` // Syntax Error ``` ## メタデータ AiScriptファイルにメタデータを埋め込める機能です。 From 38f848c72f5b815f6100b6e6b1a4fdfd8f089db2 Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Fri, 10 Nov 2023 02:34:38 +0900 Subject: [PATCH 14/26] Update syntax.md --- docs/syntax.md | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/docs/syntax.md b/docs/syntax.md index f864e531..eb09f722 100644 --- a/docs/syntax.md +++ b/docs/syntax.md @@ -84,8 +84,9 @@ var func = null ## if キーワード`if`に続く式がtrueに評価されるかfalseに評価されるかで条件分岐を行います。 +式として扱うことができ、最後の文の値を返します。 `if`の直後に1つ以上の空白またはタブを挟む必要があります。(改行があっても) -`bool`型ではない値に評価されるとエラーになります。 +条件式が`bool`型ではない値に評価されるとエラーになります。 ```js // 単行 if answer == 42 print("correct answer") @@ -93,7 +94,9 @@ if answer == 42 print("correct answer") if answer == 42 { <: "correct answer" } -// 式として使用可能( +// 条件式は()で囲ってもよい +if ({ a: true }.a) print('ok') +// 式として使用可能 <: `{if answer == 42 "collect answer"}` // else, elifも使用可能 let result = if answer == "bebeyo" { @@ -112,14 +115,22 @@ if(true) return 1// Syntax Error ``` ## for +与えられた回数のループを行います。 +ifとは異なり、式として利用することはできません。 ```js -for let i, 10 { +for let i, 5 { <: i -} +} // 0 1 2 3 4 +``` +``` +// イテレータ変数はletで宣言される必要がある +for var i, 5 { + <: i +} // Syntax Error ``` ## each -``` +```js let arr = ['chan', 'kun', 'sama'] each let v, arr { <: v From f0db47cb1f93d9f06e85c3a4baed85bf1684ec2e Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Fri, 10 Nov 2023 02:36:46 +0900 Subject: [PATCH 15/26] Update syntax.md --- docs/syntax.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/syntax.md b/docs/syntax.md index eb09f722..6584fc24 100644 --- a/docs/syntax.md +++ b/docs/syntax.md @@ -122,7 +122,7 @@ for let i, 5 { <: i } // 0 1 2 3 4 ``` -``` +```js // イテレータ変数はletで宣言される必要がある for var i, 5 { <: i From 1a3ee612e7f720659ee5eedf7975091e674010c0 Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Sat, 11 Nov 2023 16:39:17 +0900 Subject: [PATCH 16/26] Update syntax.md --- docs/syntax.md | 115 +++++++++++++++++++++++++++++++------------------ 1 file changed, 72 insertions(+), 43 deletions(-) diff --git a/docs/syntax.md b/docs/syntax.md index 6584fc24..9436a8b0 100644 --- a/docs/syntax.md +++ b/docs/syntax.md @@ -2,6 +2,11 @@ [Read translated version (en)](../translations/en/docs/syntax.md) +## 文と式 +AiScriptにおける構文要素は、コメント等を除き「文(statement)」と「式(expression)」の2つからなります。 +文は行頭または式を受け取る構文要素(ifや関数リテラルなど)にのみ記述することができます。返り値が利用されることを想定されていない構文要素であり、返り値は常にnullです。 +対して式は、文を書ける場所に加えて何らかの値を要求するほとんど全ての構文要素の内部に書くことができます。また、多くの場合何らかの意味ある値を返します。 + ## コメント `//`で始めた行や`/*` `*/`で囲んだ箇所はコメントになり、プログラムの動作に影響を与えません。 @@ -19,12 +24,14 @@ /// @ 0.16.0 ``` -## 変数・関数宣言 +## 文 + +### 変数・関数宣言 イミュータブル変数(定数)には`let`、ミュータブル変数には`var`、関数には`@`を使用します。 -### 予約語について +#### 予約語について 変数や関数の宣言において、名前として使用できないキーワードがいくつかあります。 詳しくは[keywords.md](./keywords.md)を参照ください。 -### 変数 +#### 変数 ```js // イミュータブル(再代入不可) let answer = 42 @@ -41,7 +48,7 @@ var a = 1 var a = 2 // Runtime Error let a = 3 // Runtime Error ``` -### 関数 +#### 関数 関数宣言はイミュータブル変数を関数で初期化するのと同じ動作になっています。 ```js // 最後の式が暗黙にreturnされる @@ -82,7 +89,62 @@ var func = null } ``` -## if +### for +与えられた回数のループを行います。 +```js +for let i, 5 { + <: i +} // 0 1 2 3 4 +``` +```js +// イテレータ変数はletで宣言される必要がある +for var i, 5 { + <: i +} // Syntax Error +``` + +### each +```js +let arr = ['chan', 'kun', 'sama'] +each let v, arr { + <: v +} +``` + +## グローバル文 +他の構文要素の内部に書くことを許容されない特殊な文です。 +これらの構文要素は実行開始時に巻き上げられるため、プログラム上のどこに書いても最初に読み込まれます。 + +### メタデータ構文 +オブジェクトリテラルと類似した記法でAiScriptファイルにメタデータを埋め込める機能です。 +メタデータはホストプログラムによって読まれる場合があります。 +要素として関数を除く[リテラル](./literals.md)のみが許可されており、それ以外の式は構文エラーとなります。 +```js +### { + name: "example" + version: 42 + keywords: ["foo" "bar" "baz"] +} +``` + +### 名前空間 +複数の定数・関数に共通した接頭辞をつけることのできる機能です。 +ミュータブルな変数の存在は許容されていません。 +未発達な機能であり、今後役割が大きく変更される可能性があります。 +``` +:: Ai { + let chan = 'kawaii' + @kun() { + <: chan + } +} +<: Ai:chan // kawaii +Ai:kun() // kawaii +``` + +## 式 + +### if キーワード`if`に続く式がtrueに評価されるかfalseに評価されるかで条件分岐を行います。 式として扱うことができ、最後の文の値を返します。 `if`の直後に1つ以上の空白またはタブを挟む必要があります。(改行があっても) @@ -114,30 +176,7 @@ let result = if answer == "bebeyo" { if(true) return 1// Syntax Error ``` -## for -与えられた回数のループを行います。 -ifとは異なり、式として利用することはできません。 -```js -for let i, 5 { - <: i -} // 0 1 2 3 4 -``` -```js -// イテレータ変数はletで宣言される必要がある -for var i, 5 { - <: i -} // Syntax Error -``` - -## each -```js -let arr = ['chan', 'kun', 'sama'] -each let v, arr { - <: v -} -``` - -## eval +### eval 別名ブロック式。 `{ }`内の文を順次評価し、最後の文の値を返します。 ```js @@ -150,7 +189,7 @@ let foo = eval { <: foo // 3 ``` -## match +### match ```js let x = 1 let y = match x { @@ -161,7 +200,7 @@ let y = match x { <: y // "yes" ``` -## exists +### exists 与えられた名称の変数または関数が存在すればtrue、しなければfalseを返します。 ```js // 変数barは存在しないためfalse @@ -170,10 +209,10 @@ var foo = exists bar var bar = exists foo ``` -## テンプレート構文 +### テンプレート構文 変数や式を埋め込んだ文字列を作成するための構文です。 全体を`` ` ` ``で囲い、式を埋め込む場所は`{ }`で囲います。 -式の値が文字列でない場合は、[Core:to_str](./std.md)と同じ方法で文字列に変換されます。 +式の値が文字列でない場合は、[Core:to_str](./std.md)と同じ方法で文字列に変換されます。 ```js <: `Ai chan is No.{ 2-1 }` // Ai chan is No.1 // 改行可 一行にしたい場合は{ Str:lf }を使う @@ -190,13 +229,3 @@ Previous statement is { !true }.` 'wrong' }!` // Syntax Error ``` -## メタデータ -AiScriptファイルにメタデータを埋め込める機能です。 -メタデータはホストプログラムによって読まれる場合があります。 -```js -### { - name: "example" - version: 42 - keywords: ["foo" "bar" "baz"] -} -``` From 68fae7a3d6747ad8fb3ac79deca7f3854ebe3afc Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Sat, 11 Nov 2023 17:20:16 +0900 Subject: [PATCH 17/26] Update syntax.md --- docs/syntax.md | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/docs/syntax.md b/docs/syntax.md index 9436a8b0..2134a87b 100644 --- a/docs/syntax.md +++ b/docs/syntax.md @@ -92,9 +92,27 @@ var func = null ### for 与えられた回数のループを行います。 ```js +let repeat = 5 +for repeat print('Wan') // WanWanWanWanWan +// {}を使うことで複数の文を書ける +for 2 + 3 { + <: 'Nyan' +} // NyanNyanNyanNyanNyan +// ()でくくってもよい +for ({ a: 3 }.a) { + <: 'Piyo' +} // PiyoPiyoPiyo +``` +#### for-let +イテレータ変数を宣言し、ループ内で参照することができます。 +```js for let i, 5 { <: i } // 0 1 2 3 4 +// 初期値を設定することもできる +for let i = 3, 5 { + <: i +} // 3 4 5 6 7 ``` ```js // イテレータ変数はletで宣言される必要がある @@ -104,11 +122,23 @@ for var i, 5 { ``` ### each +配列の各要素に対しループを行います。 ```js -let arr = ['chan', 'kun', 'sama'] +let arr = ['foo', 'bar', 'baz'] each let v, arr { <: v -} +} // foo bar baz +``` + +### loop +`break`されるまで無制限にループを行います。 +``` +var i = 5 +loop { + <: i + i -= 1 + if i == 0 break +} // 5 4 3 2 1 ``` ## グローバル文 @@ -131,7 +161,7 @@ each let v, arr { 複数の定数・関数に共通した接頭辞をつけることのできる機能です。 ミュータブルな変数の存在は許容されていません。 未発達な機能であり、今後役割が大きく変更される可能性があります。 -``` +```js :: Ai { let chan = 'kawaii' @kun() { @@ -185,7 +215,6 @@ let foo = eval { let y = 2 x + y } - <: foo // 3 ``` From 31ac60b0002ec0f84a80fe2eaa58440dd0264d57 Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Sat, 11 Nov 2023 17:20:59 +0900 Subject: [PATCH 18/26] Update syntax.md --- docs/syntax.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/syntax.md b/docs/syntax.md index 2134a87b..7e5d7566 100644 --- a/docs/syntax.md +++ b/docs/syntax.md @@ -132,7 +132,7 @@ each let v, arr { ### loop `break`されるまで無制限にループを行います。 -``` +```js var i = 5 loop { <: i From 14548ffbb0caaf8fdbec62de05ad4c249090c6dd Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Sat, 11 Nov 2023 17:33:27 +0900 Subject: [PATCH 19/26] Update syntax.md --- docs/syntax.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/syntax.md b/docs/syntax.md index 7e5d7566..31b47881 100644 --- a/docs/syntax.md +++ b/docs/syntax.md @@ -148,7 +148,7 @@ loop { ### メタデータ構文 オブジェクトリテラルと類似した記法でAiScriptファイルにメタデータを埋め込める機能です。 メタデータはホストプログラムによって読まれる場合があります。 -要素として関数を除く[リテラル](./literals.md)のみが許可されており、それ以外の式は構文エラーとなります。 +要素として関数を除く純粋な[リテラル](./literals.md)のみが許可されており、それ以外の式を含むと構文エラーとなります。 ```js ### { name: "example" From c360028a7cf90be6a8a2744d1677e41a79a5ef5f Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Sat, 11 Nov 2023 17:48:55 +0900 Subject: [PATCH 20/26] Update literals.md --- docs/literals.md | 52 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/docs/literals.md b/docs/literals.md index b3abef20..d4dcefb0 100644 --- a/docs/literals.md +++ b/docs/literals.md @@ -1,6 +1,7 @@ -## リテラル -AiScriptにおけるリテラルとは、スクリプト上で値をそのまま書き表すことのできる表記法です。 -null、真理値、数値、文字列、オブジェクト、関数をサポートしています。 +## リテラル式 +AiScriptにおけるリテラルとは、値を文字列として書き表すための表記法です。 +リテラルはスクリプト中でそのまま式として使用することができます。 +null、真理値、数値、文字列、オブジェクト、関数のリテラルが存在しています。 ### null ```js @@ -39,15 +40,52 @@ false ```js [] // 空の配列 [1 2 3] // 空白で区切る -[1, 2, 3] // ,で区切ることも出来る +[1, 1+1, 1+1+1] // ,で区切ることも出来る [ // 改行可 - 1, - 2, - 3, // 最後の項に,をつけてもよい + 'hoge', + 'huga', + 'piyo', // 最後の項に,をつけてもよい ] ``` ## オブジェクト +AiScriptにおけるオブジェクトは文字列のみをキーとした連想配列のようなものとなっています。 +```js +{} // 空のオブジェクト +{ + a: 12 + b: 'hoge' +} +{a: 12 b: 'hoge'} // ワンライナー +{a: 12,b: 'hoge'} // ,で区切ってもよい +{a: 12;b: 'hoge'} // ;で区切っても良い +``` +```js +// :の後に空白必須 +{a:12 b:'hoge'} // Syntax Error +``` ## 関数 +関数リテラルは[関数の宣言](./syntax.md#%E9%96%A2%E6%95%B0)とよく似た形をしていますが、関数名がありません。(そして、リテラルなので当然ながら、文ではなく式です) +```js +var func = @(){} // 何もしない関数 +// 最後の式が暗黙にreturnされる +func = @(x, y) { + x + y +} +<: func(1, 2) // 3 +// 明示的にreturnを書くこともできる +@(x, y) { + return x + y +} +// 引数を複数行で書いてもよい +@( + x, + y +) { + x + y +} +@(x,y){x+y} // ワンライナー +``` + ## エラー型 エラー型のリテラルはありませんが、[Error:create](./std.md)で値を作ることができます。 From aad71a14a851273770c06cba8e13bbda14e39e92 Mon Sep 17 00:00:00 2001 From: FineArchs Date: Sun, 12 Nov 2023 19:55:26 +0900 Subject: [PATCH 21/26] reflect reviews --- docs/literals.md | 37 ++++++++++++++++++++++++++++++------- docs/primitive-props.md | 12 ++++++------ docs/syntax.md | 25 ++++--------------------- 3 files changed, 40 insertions(+), 34 deletions(-) diff --git a/docs/literals.md b/docs/literals.md index d4dcefb0..949fa2dd 100644 --- a/docs/literals.md +++ b/docs/literals.md @@ -23,8 +23,9 @@ false ``` ### 文字列 -`'`または`"`が使用可能であり、解釈上の違いはありません。 -リテラルではありませんが、`` ` ``を使用することで文中に式を含むことができるテンプレート構文があります。→[syntax.md](./syntax.md#%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E6%A7%8B%E6%96%87) +`'`または`"`が使用可能な通常の文字列リテラルと、`` ` ``を使用し文中に式を含むことができるテンプレートリテラルがあります。 + +#### 文字列リテラル ```js 'ここでは"を文字列に含むことができます' "ここでは'を文字列に含むことができます" @@ -36,7 +37,28 @@ false できます" // ここは問題なし ``` -## 配列 +#### テンプレートリテラル +変数や式を埋め込んだ文字列を作成するためのリテラルです。 +全体を`` ` ` ``で囲い、式を埋め込む場所は`{ }`で囲います。 +式の値が文字列でない場合は、[Core:to_str](./std.md)と同じ方法で文字列に変換されます。 +```js +<: `Ai chan is No.{ 2-1 }` // Ai chan is No.1 +// 改行可 一行にしたい場合は{ Str:lf }を使う +`This statement is { true }. +Previous statement is { !true }.` +// \を前置することで`、{、}、をエスケープできる +`\` \{ \}` // ` { } +``` +```js +// { }の中身が空であってはならない({ }を文字列として使いたい場合はエスケープすること) +`Everything is { } here.` // Syntax Error +// 式の前後で改行をしてはならない(式中で改行するのは可) +`Oops, something went { + 'wrong' +}!` // Syntax Error +``` + +### 配列 ```js [] // 空の配列 [1 2 3] // 空白で区切る @@ -48,7 +70,7 @@ false ] ``` -## オブジェクト +### オブジェクト AiScriptにおけるオブジェクトは文字列のみをキーとした連想配列のようなものとなっています。 ```js {} // 空のオブジェクト @@ -64,8 +86,9 @@ AiScriptにおけるオブジェクトは文字列のみをキーとした連想 // :の後に空白必須 {a:12 b:'hoge'} // Syntax Error ``` -## 関数 -関数リテラルは[関数の宣言](./syntax.md#%E9%96%A2%E6%95%B0)とよく似た形をしていますが、関数名がありません。(そして、リテラルなので当然ながら、文ではなく式です) + +### 関数 +関数のリテラルは「無名関数」と呼ばれており、[関数の宣言](./syntax.md#%E9%96%A2%E6%95%B0)とよく似た形をしていますが、関数名がありません。(そして、リテラルなので当然ながら、文ではなく式です) ```js var func = @(){} // 何もしない関数 // 最後の式が暗黙にreturnされる @@ -87,5 +110,5 @@ func = @(x, y) { @(x,y){x+y} // ワンライナー ``` -## エラー型 +### エラー型 エラー型のリテラルはありませんが、[Error:create](./std.md)で値を作ることができます。 diff --git a/docs/primitive-props.md b/docs/primitive-props.md index 95fd1d04..3fc2830a 100644 --- a/docs/primitive-props.md +++ b/docs/primitive-props.md @@ -71,19 +71,19 @@ _i_ 番目の文字が存在しない場合は null が返されます。 配列の要素数を取得します。 ### @(_v_: arr).push(_i_: value): null -**Modifying** +**Destructive** 配列の最後に要素を追加します。 ### @(_v_: arr).unshift(i: value): null -**Modifying** +**Destructive** 配列の最初に要素を追加します。 ### @(_v_: arr).pop(): value -**Modifying** +**Destructive** 配列の最後の要素を取り出します。 ### @(_v_: arr).shift(): value -**Modifying** +**Destructive** 配列の最初の要素を取り出します。 ### @(_a_: arr).concat(_b_: arr): arr @@ -116,14 +116,14 @@ _initial_ が指定された場合は初回呼び出しの引数が(_initial_, _ 配列から _func_ が true を返すような要素を探し、その値を返します。 ### @(_v_: arr).reverse(): null -**Modifying** +**Destructive** 配列を反転させます。 ### @(_v_: arr).copy(): arr 配列のコピーを生成します。 ### @(_v_: arr).sort(_comp_: @(_a_: value, _b_: value)): arr -**Modifying** +**Destructive** 配列の並べ替えをします。第1引数 _comp_ として次のような比較関数を渡します。 * _a_ が _b_ より順番的に前の時、負の値を返す * _a_ が _b_ より順番的に後の時、正の値を返す diff --git a/docs/syntax.md b/docs/syntax.md index 31b47881..c3050b38 100644 --- a/docs/syntax.md +++ b/docs/syntax.md @@ -174,6 +174,10 @@ Ai:kun() // kawaii ## 式 +### リテラル +値をスクリプト中に直接書き込むことができる構文です。 +詳しくは→[literals.md](./literals.md) + ### if キーワード`if`に続く式がtrueに評価されるかfalseに評価されるかで条件分岐を行います。 式として扱うことができ、最後の文の値を返します。 @@ -237,24 +241,3 @@ var foo = exists bar // 変数fooが存在するためtrue var bar = exists foo ``` - -### テンプレート構文 -変数や式を埋め込んだ文字列を作成するための構文です。 -全体を`` ` ` ``で囲い、式を埋め込む場所は`{ }`で囲います。 -式の値が文字列でない場合は、[Core:to_str](./std.md)と同じ方法で文字列に変換されます。 -```js -<: `Ai chan is No.{ 2-1 }` // Ai chan is No.1 -// 改行可 一行にしたい場合は{ Str:lf }を使う -`This statement is { true }. -Previous statement is { !true }.` -// \を前置することで`、{、}、をエスケープできる -`\` \{ \}` // ` { } -``` -```js -// { }の中身が空であってはならない({ }を文字列として使いたい場合はエスケープすること) -`Everything is { } here.` // Syntax Error -// 式の前後で改行をしてはならない(式中で改行するのは可) -`Oops, something went { - 'wrong' -}!` // Syntax Error -``` From 94c4b823d1f752dc9a2605b1650bfc7607590803 Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Sun, 12 Nov 2023 22:18:17 +0900 Subject: [PATCH 22/26] Update docs/literals.md Co-authored-by: marihachi --- docs/literals.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/literals.md b/docs/literals.md index 949fa2dd..85c013b9 100644 --- a/docs/literals.md +++ b/docs/literals.md @@ -19,7 +19,7 @@ false ```js 12 // 自然数 -34 // 負数 -52.448 // 少数 +52.448 // 小数 ``` ### 文字列 From a56a8e1d164c9614316703563d9d990e7064c1e2 Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Sun, 12 Nov 2023 22:19:01 +0900 Subject: [PATCH 23/26] Update docs/syntax.md Co-authored-by: marihachi --- docs/syntax.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/syntax.md b/docs/syntax.md index c3050b38..8f33173e 100644 --- a/docs/syntax.md +++ b/docs/syntax.md @@ -3,7 +3,7 @@ [Read translated version (en)](../translations/en/docs/syntax.md) ## 文と式 -AiScriptにおける構文要素は、コメント等を除き「文(statement)」と「式(expression)」の2つからなります。 +AiScriptにおける構文要素は、コメント等を除き「文(statement)」と「式(expression)」の2つからなります。 文は行頭または式を受け取る構文要素(ifや関数リテラルなど)にのみ記述することができます。返り値が利用されることを想定されていない構文要素であり、返り値は常にnullです。 対して式は、文を書ける場所に加えて何らかの値を要求するほとんど全ての構文要素の内部に書くことができます。また、多くの場合何らかの意味ある値を返します。 From 6bd79d8c20860e984a14c20c53ee1a1459f481ec Mon Sep 17 00:00:00 2001 From: Fine Archs Date: Sun, 12 Nov 2023 22:32:18 +0900 Subject: [PATCH 24/26] reflect reviews --- docs/get-started.md | 4 ++++ docs/literals.md | 21 ++++++++++++++------- docs/syntax.md | 21 +++++++++++++++++---- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/docs/get-started.md b/docs/get-started.md index d1783936..c47ec5be 100644 --- a/docs/get-started.md +++ b/docs/get-started.md @@ -90,6 +90,7 @@ print(message) ``` 配列の要素にアクセスするときは、`[]`と書きます。 +インデックスは0始まりです。 ``` let arr = ["ai" "chan" "kawaii"] <: arr[0] // "ai" @@ -97,6 +98,9 @@ let arr = ["ai" "chan" "kawaii"] ``` ## オブジェクト +AiScriptにおけるオブジェクトは文字列のみをキーとした連想配列のようなものとなっています。 +キーと値から構成される各要素をプロパティと呼びます。 +この時キーをプロパティ名と呼びます。 `{}`の中にプロパティを`,`/`;`/空白で区切って列挙します。 プロパティ名と値は`: `で区切ります。 ``` diff --git a/docs/literals.md b/docs/literals.md index 85c013b9..604440f3 100644 --- a/docs/literals.md +++ b/docs/literals.md @@ -21,9 +21,17 @@ false -34 // 負数 52.448 // 小数 ``` +※負数を表す`-`は数値リテラルのみで使用できます。`-variable`のような表記はサポートされていません。 ### 文字列 -`'`または`"`が使用可能な通常の文字列リテラルと、`` ` ``を使用し文中に式を含むことができるテンプレートリテラルがあります。 +`'`または`"`が使用可能な通常の文字列リテラルと、`` ` ``を使用し文中に式を含むことができるテンプレートリテラルがあります。 + +#### エスケープについて +構文の一部として使われている文字は`\`を前置することで使うことができます。 +`'...'`では`\'`、 +`"..."`では`\"`、 +`` `...` ``では`` \` ``、`\{`、`\}`のエスケープがサポートされています。 +改行やタブ文字等のエスケープは未サポートです。 #### 文字列リテラル ```js @@ -61,7 +69,7 @@ Previous statement is { !true }.` ### 配列 ```js [] // 空の配列 -[1 2 3] // 空白で区切る +[1 2 3] // 空白区切り(将来的に廃止予定) [1, 1+1, 1+1+1] // ,で区切ることも出来る [ // 改行可 'hoge', @@ -71,20 +79,19 @@ Previous statement is { !true }.` ``` ### オブジェクト -AiScriptにおけるオブジェクトは文字列のみをキーとした連想配列のようなものとなっています。 ```js {} // 空のオブジェクト { a: 12 b: 'hoge' } -{a: 12 b: 'hoge'} // ワンライナー -{a: 12,b: 'hoge'} // ,で区切ってもよい -{a: 12;b: 'hoge'} // ;で区切っても良い +{a: 12,b: 'hoge'} // ワンライナー +{a: 12 b: 'hoge'} // 空白区切りは将来的に廃止予定 +{a: 12;b: 'hoge'} // セミコロン区切りは将来的に廃止予定 ``` ```js // :の後に空白必須 -{a:12 b:'hoge'} // Syntax Error +{a:12,b:'hoge'} // Syntax Error ``` ### 関数 diff --git a/docs/syntax.md b/docs/syntax.md index 8f33173e..39128bdf 100644 --- a/docs/syntax.md +++ b/docs/syntax.md @@ -103,6 +103,12 @@ for ({ a: 3 }.a) { <: 'Piyo' } // PiyoPiyoPiyo ``` +```js +// {の直前に空白必須 +for 5{ // Syntax Error + <: 'Mogu' +} +``` #### for-let イテレータ変数を宣言し、ループ内で参照することができます。 ```js @@ -129,6 +135,12 @@ each let v, arr { <: v } // foo bar baz ``` +```js +// {の直前に空白必須 +each let v, arr{ // Syntax Error + <: v +} +``` ### loop `break`されるまで無制限にループを行います。 @@ -141,7 +153,7 @@ loop { } // 5 4 3 2 1 ``` -## グローバル文 +## グローバル専用文 他の構文要素の内部に書くことを許容されない特殊な文です。 これらの構文要素は実行開始時に巻き上げられるため、プログラム上のどこに書いても最初に読み込まれます。 @@ -153,7 +165,7 @@ loop { ### { name: "example" version: 42 - keywords: ["foo" "bar" "baz"] + keywords: ["foo", "bar", "baz"] } ``` @@ -206,8 +218,9 @@ let result = if answer == "bebeyo" { <: if false 1 // null ``` ```js -// ifの直後の空白は必須 -if(true) return 1// Syntax Error +// 条件式の前後の空白は必須(かっこでくくっていても) +if(true) return 1 // Syntax Error +if (true)return 1 // Syntax Error ``` ### eval From 45806c07ce35ade2e94dc4809fcb988bfbacbf83 Mon Sep 17 00:00:00 2001 From: Fine Archs Date: Sun, 12 Nov 2023 22:41:40 +0900 Subject: [PATCH 25/26] update primitive-props.md --- docs/primitive-props.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/primitive-props.md b/docs/primitive-props.md index 3fc2830a..9b1889d1 100644 --- a/docs/primitive-props.md +++ b/docs/primitive-props.md @@ -71,19 +71,19 @@ _i_ 番目の文字が存在しない場合は null が返されます。 配列の要素数を取得します。 ### @(_v_: arr).push(_i_: value): null -**Destructive** +**【この操作は配列を書き換えます】** 配列の最後に要素を追加します。 ### @(_v_: arr).unshift(i: value): null -**Destructive** +**【この操作は配列を書き換えます】** 配列の最初に要素を追加します。 ### @(_v_: arr).pop(): value -**Destructive** +**【この操作は配列を書き換えます】** 配列の最後の要素を取り出します。 ### @(_v_: arr).shift(): value -**Destructive** +**【この操作は配列を書き換えます】** 配列の最初の要素を取り出します。 ### @(_a_: arr).concat(_b_: arr): arr @@ -116,14 +116,14 @@ _initial_ が指定された場合は初回呼び出しの引数が(_initial_, _ 配列から _func_ が true を返すような要素を探し、その値を返します。 ### @(_v_: arr).reverse(): null -**Destructive** +**【この操作は配列を書き換えます】** 配列を反転させます。 ### @(_v_: arr).copy(): arr 配列のコピーを生成します。 ### @(_v_: arr).sort(_comp_: @(_a_: value, _b_: value)): arr -**Destructive** +**【この操作は配列を書き換えます】** 配列の並べ替えをします。第1引数 _comp_ として次のような比較関数を渡します。 * _a_ が _b_ より順番的に前の時、負の値を返す * _a_ が _b_ より順番的に後の時、正の値を返す From b47afc69e9e4e88592aad6fe8412b0d6664aaf2e Mon Sep 17 00:00:00 2001 From: FineArchs <133759614+FineArchs@users.noreply.github.com> Date: Mon, 13 Nov 2023 12:21:48 +0900 Subject: [PATCH 26/26] Update syntax.md --- docs/syntax.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/syntax.md b/docs/syntax.md index 39128bdf..1cc63213 100644 --- a/docs/syntax.md +++ b/docs/syntax.md @@ -221,6 +221,10 @@ let result = if answer == "bebeyo" { // 条件式の前後の空白は必須(かっこでくくっていても) if(true) return 1 // Syntax Error if (true)return 1 // Syntax Error +// elif, elseの直前の空白は必須 +if (false) { +}elif (true) { // Syntax Error +}else {} // Syntax Error ``` ### eval