uguisu-dev / uguisu Goto Github PK
View Code? Open in Web Editor NEWThe Uguisu is a statically typed scripting language.
Home Page: https://uguisu-dev.github.io
License: MIT License
The Uguisu is a statically typed scripting language.
Home Page: https://uguisu-dev.github.io
License: MIT License
現行のparse::Nodeからanalyze::Nodeを生成する際のReferenceノード部分の動作:
これだと変数参照の部分で文法エラーが出た場合にソースコード上とは違う位置を指すようになってしまった。
そのため、Referenceノード自体は残すように変更する。
構文
a == b
a != b
a < b
a <= b
a > b
a >= b
fn main() {
var x = 1;
assertEqNum(x, 1);
var x = 2;
assertEqNum(x, 2);
}
今の環境から値を取得する時に親のフレームまで見に行く必要はないため (動的束縛の仕様となっていれば必要)。
構文イメージ
if cond {
} else if cond {
} else if cond {
} else {
}
https://github.com/uguisu-dev/uguisu/tree/develop
状況: 実装済み
ソースコードからASTを生成するモジュール
\n
など)+=
など)状況: 進行中
静的解析を行うモジュール
状況: 実装済み
ASTとその他の情報を使ってスクリプトの実行を行うモジュール (インタプリタ)
+=
の形の演算子
構文案
var x: Option<number> = null;
// cast interfaces
var player: Char = Char { };
var y: Option<Drawable & Position> = player;
y = null;
nullリテラルとOption<T>
型の追加。
Optionを明示しない限りはnull値を許容しない。
Option<T>
とするのでGeneric型(インターフェース)もサポートする方が自然?
fn add(x: number, y: number): number {
return x + y;
}
fn add(x: string, y: string): string {
return concatStr(x, y);
}
var a: number = add(1, 2);
var b: string = add("hello", " world");
use core;
fn main() {
const x = 1;
core.print_num(x);
core.assert_eq(x, 1);
}
use core::print_num;
use core::assert_eq;
fn main() {
const x = 1;
print_num(x);
assert_eq(x, 1);
}
以前に型チェックを行っていて型が正しいと分かっている場合は、型チェックは不要なためスキップできると良いかも
仕様に言語バージョンを与えて互換性を維持しやすくする。
プロジェクトで言語バージョンを指定するイメージ。
そもそも仕様がまずいかも
機能の読み込みに、外部関数の宣言をやめる?
案1.
use core;
fn main() {
const x = 1;
core.print_num(x);
core.assert_eq(x, 1);
}
use core::print_num;
use core::assert_eq;
fn main() {
const x = 1;
print_num(x);
assert_eq(x, 1);
}
バイナリデータを操作したい時に要りそう
再現コード
fn main() {
main = 1;
}
構文
var x = 5;
var = [1, x, true];
構文
true
false
const flag = true;
fn func(x: bool) { }
// abc
/*
abc
123
*/
変数の初期値が付いてるかどうかに関係なく全体を変数宣言として扱う。
パーサーで扱いやすいため
変数宣言に初期値が付いてる場合は、変数宣言と代入の2つのグラフノードを生成する。
→ 初期値付きと初期値無しの変数宣言を生成するようにした。
変数宣言のタイミングでは型推論を行わない。
代入のタイミングで、変数宣言に対して型推論をする。
変数と同じ感じで
宣言された変数や関数を使う際は、必ず参照ノードを経由して宣言ノードにアクセスする。
これはモデルとの整合性を保つための意味合いもある:
Node.jsみたいにC互換のライブラリを読み込めると便利かも
libloadingクレートを使えば動的ロードできる?
var
のみにするconst
は再代入不可の変数として使用されているが、将来的に定数として使用される可能性があるかもしれない今後の拡張性のため。
$ uguisu filename.ug
$ uguisu run filename.ug
+123
-123
var x = 2 ** 4;
assertEq(x, 16);
var x: float = 123.4;
Craneliftの雰囲気は何となく分かった。
これを使って全てのコードを生成することは困難な気がする。
一旦はインタプリタとしてスクリプトエンジンを構築し、言語の設計を進めていくことにする。
interface Item {
search(name: string): bool;
}
class File {
name: string;
}
impl File : Item {
search(name: string): bool {
return this.name == name;
}
}
class Directory {
name: string;
}
impl Directory : Item {
search(name: string): bool {
return this.name == name;
}
}
つらくなるため
実行時のブロックごとにフレームを追加したら、変更した変数の値が消えてしまった。
→ そもそもこの実装は間違ってた。このスタックは環境を分けるために使う。
HIRコードの生成時に変数とシンボルの対応関係は解決済みなので、そもそも実行時はシンボルの管理をレイヤー状にする必要はないかもしれない
→ 関数コールのときは環境が別になっていてほしいから、レイヤー状にはなっていないといけない。
今の環境から値を取得する時に親のフレームに見に行く必要はない。
まずはどんな方法があるかを考えていく
関連技術
fn add(x: number, y: number): number {
return x + y;
}
fn add(x: string, y: string): string {
return concatStr(x, y);
}
var a: number = add(1, 2);
var b: string = add("hello", " world");
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.