シンプルな構文から構文糖によってC言語っぽい構文を作ってみるテスト。色々問題があるけど一日で考えたらこれが限界な罠。
- 型は実行型では無く論理型とする。コンパイル時に一番適した実行型に変換される。
- 型と値を同一視する。
- コンパイル時にJavascriptのように変数の内容を書き換えることができる。
- 同じスコープでは前方参照を行わない。これは文の中でも同じ。子スコープは親スコープの全ての定義が終わった後処理する。
- 生成修飾子としてconstとstaticとdynamicがあり、constは生成まで、staticは静的まで、dynamicは動的までを表す。標準はstatic。
- ソースコードのトップレベルのスコープはconst Statement[]として扱う。
- 空の型としてnil型がある。
- 生成とはコンパイルした後残らないということを意味する(ただし実装する側は内部的に残しても構わない)。
- ObjectX(args...)でObjectXの派生オブジェクトを作る。
- ObjectX{a,b,c...}はArray(ObjectX, {a,b,c...})を表す、ObjectXはArray(ObjectX)を表す。
- ObjectX[type]({a=x,b=y,p c=z...})はAssociativeArray(ObjectX,type,{a=x,b=y,p c=z...})を表す(ただしpはObjectXから派生してるとする)、ObjectX[type]はAssociativeArray(ObjectX,type)を表す。
- ObjectはStatement[]を表す。
- Statement[]からFunctionへの変換は可能。
- a.bはa[b]に置き換えられる。
- thisは自分自身を表す。superは親を表す。
- {}はObject{}に、Object(a,b,c...){}はObject(a,b,c,Object{})に置き換えられる。
- Statement内の変数 = 値は変数 = 変数.parent(初期値)に、型 変数 = 値は型 変数 = 型(初期値)に変換する。
- 連想配列の宣言はStatement[]と同じ、ただし型の省略が可能。//fixme
- Object、Array、Statement、Functionがあり全てObjectから派生されていて以下のように定義されている。
- Object() // 型を複製(強いtypedef)
- Object(Object val) // 値/初期値のある型を生成
- Object(Statement[] decls) // 復号型を生成
- Object(Statement[] decls, Object val) // 初期値のある復号型を生成
- Object Object.parent // 派生元の型
- this Object.value // 初期値
- Function(Object returnType, Statement[] decls) // 関数型を生成
- Function(Object returnType) // 関数型を生成
- Function(Object returnType, Statement decls, Statement body) // 関数の値/初期値のある関数型を生成
- Function(Object returnType, Statement[] body) // 関数の値/初期値のある関数型を生成
- Function.returnType
- Function.decls
- Function.body
- Array(Object type) // 配列型を生成
- Array(Object type, type[] value) // 配列の値/初期値のある配列型を生成
- Object Array.type
- Array.type[] Array.value
- Declaration(Object type, Object valueType)
- Declaration(Object type, Object valueType, Object init)
- Object Declaration.type
- Object Declaration.valueType
- Statement(Object placeholder) // 文型を生成
- AssociativeArray(Object type, Object valueType) // 連想配列型を生成
- AssociativeArray(Object type, Object valueType, Statement[] values) // 初期値のある連想配列型を生成
- Object AssociativeArray.type
- Object AssociativeArray.valueType
- Statement[] AssociativeArray.values
こうだらだらいわれても分かり難そうだから適当に例を書いてみる。
関数はこんな感じ。
import io, Function add = Function(int, {int a,int b}){ return a+b, }, Function(int, {char[][] args}) main = {//型変換を使った書き方 writefln(add(2,4)), return 0, },
複合型はこんな感じ。
Type Point = Object(){ int x, int y, }, Type _3DPoint = Point(){ int z, }, Type APoint = Point({x=10,y=20}),
弱いtypedefや強いtypedefも可能。
Type t = int,//弱いtypedef Type t = int(),//強いtypedef
関数のオーバーロード
import io, Function[] test = { Function(int){ return 0, }, Function(int, {char[] str}){ return str.length, }, }, Function(void) main = { writefln(test()),//0 writefln(test("test")),//4 },
配列、連想配列
import io, Function(void) main = { char[] str = {1,2,3}, str = "test", writefln(str), char[][char[]] strs = {"a" = "x","b" = "y","c" = "z"}, strs.foreach({int i, char[] str}){ writefln("%s:%s",i,str), }, },