最近作ってるプログラミング言語
はじめに
この言語の名前はAWS(AWScript)です。
"AWSはプログラミング言語"というネタがTwitterなどで散見される中、言語の名前をDiscordで募集した結果 Air Water Script、 略してAWS という非常に紛らわしい案が出たので採用しました。
何かしら実害が出たら変えます。
まぁ普及するわけもないので多分大丈夫
※この言語は互換性も実用性も皆無です
コード
今のところこんな感じのコード
#func main() : int
var car : Car = Car(5);
car.put();
return 0;
#class Car(speed : int)
var me.speed : int = speed;
func put() : int
me.speed.print();
これはC++の
#include<iostream>
int main(){
Car car(5);
car.put();
return 0;
}
class Car {
public:
int speed;
Car(int s){
speed = s;
}
int put(){
std::cout << speed;
}
}
と同じ意味になる。
文法
-
型の表現
to 型
でポインタ型
func(型, 型, …) -> 型
で関数型
を表す。
例えば、C言語のsignal関数の型は
func(int, to func(int)->void)->to func(int)->void
と表せる
-
変数定義
var 変数名 : 型 [= 初期値], …
でローカル変数を定義出来る。
コンストラクタ内で変数名にme.
をつけるとメンバ変数の定義になるが、
var val : int, me.val : int;
のような書き方も出来るので少し分かりづらい
-
関数定義
#func 名前(引数1 : 型, …) : 戻り値の型
//statements
型の表現
to 型
でポインタ型
func(型, 型, …) -> 型
で関数型
を表す。
例えば、C言語のsignal関数の型は
func(int, to func(int)->void)->to func(int)->void
と表せる
変数定義
var 変数名 : 型 [= 初期値], …
でローカル変数を定義出来る。
コンストラクタ内で変数名にme.
をつけるとメンバ変数の定義になるが、
var val : int, me.val : int;
のような書き方も出来るので少し分かりづらい
関数定義
#func 名前(引数1 : 型, …) : 戻り値の型
//statements
で関数を定義でき、関数名はその関数を指した関数型の変数として扱える
(C言語と似た感じ)
- クラス定義
#class 名前(コンストラクタの引数1 : 型, …)
//statements of constructor
func メンバ関数名(引数1 : 型, …) : 戻り値の型
//statements
クラスの名前と一緒にコンストラクタの引数リストを書き、その後にコンストラクタの中身を書く。
コンストラクタの定義のためにクラス名をもう一度書く手間が省ける
特徴
-
関数とクラスの終わりの判断
関数⋯#func
クラス⋯#class
メンバ関数⋯func
を先頭に置くことで、次の関数orクラス定義までを定義の終端と判断する。
この仕様のため、Pythonのようなコードになっているが、インデントは文法に関係ない
-
オブジェクト指向
クラスの継承とvtableによる多態性を実装しているので下のコードが動かせる
#main() : int
var a1 : t1 = t1();
var a2 : t2 = t2();
var p1 : to t1 = &a1;
var p2 : to t1 = &a2;
p1->put(); //1
p2->put(); //2
#class t1()
func put() : int
putchar('1');
#class t2() : t1
func put() : int
putchar('2');
おわりに
関数とクラスの終わりの判断
関数⋯#func
クラス⋯#class
メンバ関数⋯func
を先頭に置くことで、次の関数orクラス定義までを定義の終端と判断する。
この仕様のため、Pythonのようなコードになっているが、インデントは文法に関係ない
オブジェクト指向
クラスの継承とvtableによる多態性を実装しているので下のコードが動かせる
#main() : int
var a1 : t1 = t1();
var a2 : t2 = t2();
var p1 : to t1 = &a1;
var p2 : to t1 = &a2;
p1->put(); //1
p2->put(); //2
#class t1()
func put() : int
putchar('1');
#class t2() : t1
func put() : int
putchar('2');
この言語を作っていて、間違ったコードが入力されたときに正しくエラーを返すのが難しかった。
var : int = 5
のような想定する入力が欠けたコードが入力されると無限ループになったり落ちたり。
改めて世のコンパイラは凄いと思いました(小並感)
Author And Source
この問題について(最近作ってるプログラミング言語), 我々は、より多くの情報をここで見つけました https://qiita.com/Trail1004/items/2ff08148bd6faed59190著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .