「Get Started」では、この言語についてを知り、セットアップをして、簡単にこの言語を知っていきましょう。
この言語は、「Wagyu-script」という半角スペース区切りが特徴のプログラミング言語です。名前の由来は私のネット上でのユーザー名である「@kuroge」にちなんで名づけました。
リポジトリのページの左側に「Releases」という項目があるのでそこからそれぞれのOS向けの最新版をDLしてください。インストールは不要です。
DL後、ファイル解凍後の実行方法は以下の通りです。(拡張子は、.wgとしていますが、テキストファイルなら.txtなどでも大丈夫です。)
GNU/Linux
./wagyu-script run ファイル名.wgWindows
./wagyu-script.exe run ファイル名.wgこの言語はかのC言語やJavaと比べて簡単に書くことができます。以下はHello, World!とプロンプトに出力する一番基本的なプログラムです。
println "Hello, World!";
一般的な出力(行末に改行をつける)はprintln関数でできます。基本的に引数は半角スペース区切りで関数名のあとに続きます。引数の"~"は文字列型と言います。クオーテーションで囲まれたものです。シングルクオーテーションで'~'とも表せます。
また正規表現を利用する際には、文字列を`〜`(バッククォート)で囲むこともできます。
またこの言語は1関数ごとの行末に;(セミコロン)が必要です。関数ごとの改行あり/なしによってプログラムの意味が変わることがないので、一行に詰めて書くことも可能になります。
println "Hello!";println "World!";
※ printlnの引数には変数も入れられます。
コメントというのは、プログラムに関するメモなどを自由に記述できるものです。コメントの内容は動作に影響を与えません。
// コメントの内容;
コメントにも行末に;が必要であることに注意してください。
この言語ではほとんど自動で解釈されるためほぼ使われませんが、型を指定する関数もあります。以下はその型の一覧です。
| 名称 | 型名 | 型に入れられる内容 |
|---|---|---|
| 文字列型 | string | 文字列(ex: "Hello!") |
| 配列型 | array | 配列(ex: ("Hello" "World" "Wagyu")) |
| 整数型 | int | 整数の値(ex: 10) |
| 小数型 | float | 小数の値(ex: 3.14) |
| 辞書型 | dict | 辞書(ex: {"key1" : "value1" "key2" : 2 ...}) |
| 正規表現型 (予約) | regex | 正規表現(ex: [a-z]) |
println以外にも以下のような出力の関数を用意しています。
-
printfフォーマットに則って文字列に変数を入れ込み出力する(行末の改行無し)。printf "フォーマット" 変数1 変数2 ...;フォーマットでは、例えば
:1:を入れると、引数に追加された1番目の変数名をそこに入れ込むことができます。以下はそれを用いたプログラムの例です。※ この例では、変数
xにTanakaという文字列 型の値が入っているものとします。printf "Hello, :1:!" x; // -> 「Hello, Tanaka!」と出力されます。 -
print文末の改行無しで、文字列を出力する。print 文字列or変数名;
変数を宣言・初期化には二通りの方法があります。
- 変数を宣言し、初期化する
- 普通の値の場合
変数名 = value 値; - 配列の場合
変数名 = array (値1 値2 値3 ...); - 省略することもできます
変数名 = 値; - 複数の変数を宣言する場合
vars (変数名1 変数名2 ...) (値1 値2 ...);
- 普通の値の場合
- 空の変数を宣言のみする
- 1つだけの場合
make var 変数名; - 2つ以上の場合
make var 変数名1 変数名2 ...;
- 1つだけの場合
※ 値はすべて文字列型として代入し、計算する都度数値型に戻されます。
※ 変数の参照をするときは引数に変数名を入れれば、自動的に参照先の値に戻されたりします。
変数の値を単に増やしたい/減らしたい時は、addというのも使うことができます。
変数名 = add 数値(負の数も対応);
以下はaddを使って変数xの値を+1するプログラムの例です。
x = value 1;
x = add 1;
println x;
// -> 「2」が出力される;
変数の代入や関数の引数などに計算した結果などを入れたい場合は、演算子を用いて計算を行います。以下はその例です。
println ##(1 + 2); // -> 「3」が出力される;
x = ##(1 + y); // -> 変数xに変数yの値と1を足したものを代入する;
x = ##(1 + 1 == 2); // -> 変数xに1 + 1が2と等しいかどうかの結果を代入する;
この言語では以下の演算子が使え、以下のような優先度になっています。(上から順に優先度が高い)
| 演算子 | 記号 |
|---|---|
| 括弧 | () |
| 否定 | ! |
| 累乗 | ** |
| 乗算 | * |
| 除算 | / |
| 剰余 | % |
| 加算 | + |
| 減算 | - |
| A > B (AがBより大きい) | > |
| A < B (AがBより小さい) | < |
| A >= B (AがB以上) | >= |
| A <= B (AがB以下) | <= |
| A == B (AがBと等しい) | == |
| A != B (AがBと等しくない) | != |
| A && B (AかつB) | && |
| A || B (AまたはB) | || |
この言語での条件分岐(if文)は以下のように書きます。3通りの書き方があります。
- 真の時に実行されるプログラムだけ書く場合
if 条件文 {
実行内容;
...
};
- 真の時と偽の時に実行されるプログラムを書く場合
if 条件文 {
真の時の実行内容;
...
} else {
偽の時の実行内容;
...
};
- 真の時と偽の時、そして偽の時にもまた条件分岐(else-if)を設けるとき
if 条件文 {
真の時の実行内容;
} elif 条件文2 {
真の時の実行内容;
} else {
偽の時の実行内容;
};
条件文はtrueとfalse、もしくは1(true)・0(false)という演算結果の値で判断します。また、条件文のところは先ほどの##(~)で書くことができます。
以下は、変数xが1であったらGood!と表示すし、そうでなかったらOh, no...と出力するプログラムです。
if ##(x == 1) {
println "Good!";
} else {
println "Oh, no...";
};
この言語では、「数字や文字の一致を確かめるだけなのにifじゃあ面倒くさいなぁ」ということで、matchという機能を提供しています。matchは、条件に合致するときに実行される内容を書くことができます。
matchの書き方は以下の通りです。
match 変数名
case 値1 {
実行内容;
...
}
case 値2 {
実行内容;
...
}
default {
実行内容;
...
};
値は変数も入れることができます。また、caseの後には{}で囲んで実行内容を書きます。
caseは、条件に合致する値を書きます。もし、その値が変数名の値と一致した場合、そのcase内の内容が実行されます。また、条件に合うケースが複数ある時はそれらがすべて実行されるためbreakなどを適度使ってください。
もしシャープ関数を使ったら、その結果がtrueもしくは1の場合に実行されます。その場合、シャープ関数内引数の変数名にあたるところは_で代用できます。
x = value 1;
match x
case ##(_ == 1) { // 実際この程度なら普通に1と書いた方がいいですが、例示のために;
println "Good!";
}
case ##(_ == 2) {
println "Nice!";
};
このように_で書いた所は、変数xの値、つまり1に置き換えられます。
defaultは、どのcaseにも合致しなかったときに実行される内容を書きます。match文内の一番最後に書く必要があります。
以下は、変数xが1のときGood!、2のときNice!、それ以外のときOh, no...と出力するプログラムの例です。
match x
case 1 {
println "Good!";
}
case 2 {
println "Nice!";
}
default {
println "Oh, no...";
};
この言語ではwhileという繰り返し機能を提供しています。
whileでは、条件がtrueもしくは1の間中の処理を繰り返すことができます。以下が基本的な形です。
while 条件文 {
実行内容;
...
};
以下は、変数xが5になるまで。つまり5回while内の内容を繰り返すというプログラムの例です。
x = value 1;
while ##(x <= 5) {
println "Hello!";
x = add 1;
};
配列の繰り返し機能としては、eachという機能を提供しています。eachは、配列の要素を1つずつ取り出して繰り返し処理を行うことができます。
eachの書き方は以下の通りです。
each 配列名or配列 > 変数名 {
実行内容;
...
};
変数名には、配列の要素を1つずつ取り出したときにその値を入れる変数名を指定します。その変数は自動的に作成され、そのブロック内でのみ有効です。
以下は、配列arrの要素を1つずつ取り出して出力するプログラムの例です。
arr = array ("Good" "Nice" "Great");
each arr > i {
printf ":1:!\n" i;
};
これを実行すると、Good!、Nice!、Great!の3つが出力されます。
配列のインデックスを取得する時は、>のところを:に変えることで可能です。以下はその例です。
arr = array ("Good" "Nice" "Great");
each arr : i {
printf ":1:\n" i;
};
これを実行するとarrのインデックス、つまり0、1、2が出力されます。
辞書型の繰り返しも提供しています。その場合のeachの書き方は以下の通りです。
each 辞書 > (キー 値) {
実行内容;
...
};
eachのブロック内で、キーと値の2つの変数を指定することで、辞書のキーと値を取り出すことができます。
以下は、辞書dictのキーと値を取り出して出力するプログラムの例です。
dict = {"key1" : "value1" "key2" : "value2"};
each dict > (key value) {
printf ":1: :2:\n" key value;
};
これを実行すると、key1 value1、key2 value2の2つが出力されます。
また、繰り返し処理を中断したりやり直したりするために、break・continue関数が提供されています。
break関数は以下のように書き、実行すると繰り返し処理を中断して繰り返し処理のループから抜けます。
break "";
continue関数は以下のように書き、実行すると繰り返し処理を始めに戻してやり直します。
continue "";
この言語では関数の宣言としてfncを使用します。関数を宣言することで様々な処理をひとかたまりにして、何度でも呼び出すことができます。
関数の宣言は、以下のように書きます。
fnc 関数名 (引数1 引数2 ...(任意)) {
関数の実行内容;
...
};
関数の呼び出しは、以下のように書きます。
関数名 (引数1 引数2 ... (ある場合は書く));
また返り値(return)がある場合は、to 変数名を引数を追加します。
関数名 (引数) to 返り値を入れる変数名;
関数で、返り値を返すにはreturn 値;を使用します。それが実行されると返り値を返して関数の処理を終了します。
以下は関数を用いて人の名前を入力して挨拶の文言を出力するプログラムの例です。
fnc say_hello ($name) {
printf "Hello, :1:!\n" $name;
};
say_hello ("Tanaka");
say_hello ("Yamada");
// -> 「Hello, Tanaka!」と「Hello, Yamada!」の2つが出力される。;
以下は関数を用いて2数の足し算の和を返すプログラムの例です。
fnc add ($x $y) {
return ##($x + $y);
};
make var result;
add (1 2) to result;
println result;
// -> 「3」と出力される;
基本的な関数や機能について説明しました。 その他の関数については以下のページを参考にしてください → 標準関数一覧
様々なサンプルコードを用意しています。ぜひ参考にしてください。 → サンプルコード