Very Simple .NET Language for embed
阿小町(あこまち)は、稲荷神 宇迦之御魂神(ウカノミタマノカミ)の眷属の狐の一匹です。伏見稲荷大社では、白虎社に祀られています。
トランス状態(狐憑き)になって神と交わるダンスをする巫女と同一視されてたそーです。
- 処理系のセーブデータを保存して、復帰できる
- (エンジンの)ソースコードが短い
- メモリ使用量が少ない
- 遅くても仕方ない
またこりもせずJSパクリ言語です。 This lang is similar to JS.
1; //int
1.0; //float
true; false; //bool
"Hey!" // string (JSONと一緒)
[1, 2, 3, "str"]; //list
// オブジェクト記法
var obj = {val1: 1, val2: true};
obj.val2; // --> true
// 演算子は中置記法
1+2;
// 変数は宣言が必要(初期化子は絶対必要)
var x = 1;
// if式
var res = if 1 == 1 then "t" else "f";
res; // --> "t"
// 複文を書く時はカッコで囲う
var res = if 1 == 1 then {var x=1; x+1;} else "f";
res; // --> 2
// 関数
var fn = fun (a,b,c) a+b+c;
// 複文を書く時はif同様カッコで囲う
var fn = fun (a,b,c) { a+b+c; 1+2; }
// グローバル変数を宣言するには、"global"に代入。
global.z = 1;
z; // --> 1
var obj = { fn: fun (x, y, z) self.x, x: true };
obj.fn(1,2,3); // --> true つまり、selfの仕様はJSのthisと同じ
var fn = fun (x, y, z) self;
fn(1,2,3); // --> null このあたりも同じ
ビルドして出来上がったAkomachi.dllとFShapCore.dllをreferencesに追加し、以下のサンプルコードを参考に組み込んでください。
namespace AkomachiRunCS
{
class Sys
{
public void println(String src)
{
Console.WriteLine(src);
}
public void print(String src)
{
Console.Write(src);
}
}
class Program
{
static void Main(string[] args)
{
Akomachi.Akomachi ako = new Akomachi.Akomachi();
ako.setGlobalObject("System", (Object)new Sys());
if(args.Length > 0) {
System.IO.StreamReader stream = System.IO.File.OpenText (args[0]);
String src = stream.ReadToEnd();
Akomachi.Parser.Result parseResult = ako.parse(src);
if( parseResult.IsSuccess ) {
Akomachi.Parser.Result.Success succ = (Akomachi.Parser.Result.Success)parseResult;
ako.dance(succ.Item);
// or
// Akomachi.Parser ast = ako.parseOrThrow(src);
// ako.dance(ast);
// この時、パースエラーの時は例外を投げます。
}else{
Akomachi.Parser.Result.Error err = (Akomachi.Parser.Result.Error)parseResult;
Console.WriteLine("Failed to parse: {0}", err.Item);
}
}else{
Console.WriteLine("Usage: {0} <src>" , System.AppDomain.CurrentDomain.FriendlyName);
}
}
}
}
ビルドして出来上がったAkomachi.dllをreferencesに追加し、以下のサンプルコードを参考に組み込んでください。
open Akomachi
type System()=
member self.println(s:string) = printfn "%s" s
member self.print(s:string) = printf "%s" s
[<EntryPoint>]
let main argv =
let akomachi = Akomachi.Akomachi();
akomachi.setGlobalObject("System", new System() :> obj)
if argv.Length > 0 then
let stream = System.IO.File.OpenText (argv.[0])
let src = stream.ReadToEnd()
match akomachi.parse src with
| Akomachi.Parser.Success ast ->
let v = akomachi.dance ast
0
| Akomachi.Parser.Error err ->
printfn "Failed to parse: %s" err
-1
else
printfn "Usage: %s <src>" System.AppDomain.CurrentDomain.FriendlyName
0
// セーブデータはStringです。
String savedata = ako.save();
// コンストラクタに指定すると、読み込みます。
Akomachi.Akomachi new_ako = new Akomachi.Akomachi(savedata);
// 以下続行
ako.setGlobalObject("IntValue", 1);
ako.setGlobalObject("FloatValue", 1.0);
ako.setGlobalObject("BoolValue", true);
ako.setGlobalObject("StringValue", "string");
ako.setGlobalObject("NativeObjectValue", new YourClass());
登録したオブジェクトはグローバル変数として登録されます。 ネイティブオブジェクトを登録し、それをセーブデータに含める場合、public String Save()というメソッドが必要です。