狠狠撸

狠狠撸Share a Scribd company logo
株式会社ヘマタイト?
?
東京都品川区東五反田5-22-37?
オフィスサークルN五反田 4階
? 2020 株式会社ヘマタイト
?
Hematite TechTalk?
Linq でつくるスクリプト言語?
? 2020 株式会社ヘマタイト
概要
言語自作ネタです
ヘマタイトの業務には、ほぼ関係しません
? 2020 株式会社ヘマタイト
C#
C# / .Net はほぼ OSS になりました
もはや開発にVisualStudio は必須ではありません
VisualStudio とほぼ同じことが dotnet の CLI で提供されます
ただし VisualStudio は GUI ツールとして非常に便利
C# にはおもしろい技術がいっぱい
Linq
ReactiveExtensions (Rx)
Blazor
Roslyn
? 2020 株式会社ヘマタイト
Linq
? 2020 株式会社ヘマタイト
LINQ
C# のすごい機能
配列?DB?XML などに対する統一的な API でのクエリ
メソッドチェインと その糖衣の SQL Like な専用構文
以上は今回の話にはあまり関係ありません
? 2020 株式会社ヘマタイト
閑話休題
? 2020 株式会社ヘマタイト
スクリプト言語つくるは大変
? 2020 株式会社ヘマタイト
スクリプト言語って?
ここでいうスクリプト言語とは、Lua みたいなやつのことで
す
プログラム側から呼び出したり、メソッドや変数を渡したり
できる
ゲームを作る人がよく使う
その他プラグイン機構とか、マクロとか
インタプリタ +α の実装が必要
? 2020 株式会社ヘマタイト
スクリプト言語
構文解析
プログラム側との
バインディング
実行(評価)
? 2020 株式会社ヘマタイト
Linq Expression
? 2020 株式会社ヘマタイト
Linq Expression
実行可能な式木が提供されます
ある種のラムダ式から作ることもできます
当然実行時に作成することも可能
Linq とは独立しており、単独で使用できます
Linq という名前なのはクエリに使うことが想定されていた?
文も含めてなど言語機能は一通り使用できます
昔は式しか使えませんでした
? 2020 株式会社ヘマタイト
Linq Expression
Func<int, int> f = i =>
{
int x = 0;
for (; ;)
{
x += i;
i -= 1;
if (i <= 0) break;
}
return x;
};
var x = Expression.Parameter(typeof(int), "x");
var i = Expression.Parameter(typeof(int), "i");
var endLoop = Expression.Label("EndLoop");
var body = Expression.Block(
typeof(int),
new[] { x },
Expression.Assign(x, Expression.Constant(0)),
Expression.Loop(
Expression.Block(
Expression.AddAssign(x, i),
Expression.SubtractAssign(i,
Expression.Constant(1)),
Expression.IfThen(
Expression.LessThan(i,
Expression.Constant(0)),
Expression.Break(endLoop))),
endLoop),
x);
var e = Expression.Lambda<Func<int, int>>(
body, i);
var f = e.Compile();
https://ufcpp.net/study/csharp/sp3_expression.html
? 2020 株式会社ヘマタイト
Linq Expression
実行時に式木を作ればスクリプトを実行できる
リフレクションを使うと、プログラム側から
オブジェクトやメソッドを提供することも可能
当然評価した結果を利用した処理もできる
? 2020 株式会社ヘマタイト
Linq Expression
構文解析 Linq Expression
? 2020 株式会社ヘマタイト
Linq Expression についてくるもの
実行?評価器
型検査器 (dynamic もあるので動的型付けも OK)
シンボル解決
etc...
? 2020 株式会社ヘマタイト
Linq Expression Tips
動的型付けにはできるが、変数宣言は必要
宣言不要にするには、やや工夫が必要
Expressions.XXX ですべての構文を構築すると
C# コードの可読性が終わる
できるだけ C# で書いて、それを Experssions から呼び出す
? 2020 株式会社ヘマタイト
構文解析すれば言語が作れる
(構文解析は頑張りましょう)?
? 2020 株式会社ヘマタイト
C# は楽しい
おわり?

More Related Content

Linq Expressions でつくるスクリプト言語