こんな俺言語を考えてみた
架空の言語の仕様を考えるのが趣味です、というわけで
こんな俺言語を考えてみました。
言語実装の経験はないのでおかしなところは大目に見つつ教えてください。
1. 変数がある
a:Int = 2 b = 3 // 型は推測される
2. 変数には再代入できない
a = 2 a = 3 // ERROR!
3. 関数がある
// 常に 0 を返す関数 // 引数が同じなら戻り値も同じ, 故に引数がない関数は値と同列 zero = { 0 } zero // 0
4. 引数をとる
inc = { n:Int, n+1 } // n が引数, 1 足す inc(1) // 2
5. 引数をいっぱいとる
sum = { a:Int, b:Int, a+b }
6. デフォルト値を持つ引数
round = { f:Double, virtual base:Double=1, (略) } // f を base の倍数に丸める // base はデフォルト値を持つ round(3.5) // 4
7. スコープを外に出す
Point = { x:Int, y:Int, this } // this で現在のスコープが外に出る p = Point(-1, 1) // p が外に出たスコープ p.x // 値は-1, スコープの中にアクセス可能 p.y // 値は1
8. スコープに変数を加える
Point = { x:Int, y:Int, r = x*x + y*y, this } p = Point(3, 4) p.r // 5
9. 他のスコープを展開する
Point = { x:Int, y:Int, r = x*x + y*y, this } p = Point(3, 4) v = { extract p, r } // v=5, 関数の定義に似ているが引数のない関数は値と同列
10. this から隠したい変数
Point := { x:Int, y:Int, private r=sqrt(x*x+y*y), this } p = Point(3,4) p.r // エラー { extract p, r } // エラー
11. 展開後の変数を this から隠す
p = Point(3,4) v1 = { private extract p, x } // 使える v2 = { private extract p, this }.x // エラー
12. this したものを外部から与える
p = Point(3,4) getR = { private extract _:Point, sqrt(x*x+r*r) } v = getR(p) // v=5 // p.getR とはできないんだよなぁ…
13. 「.」はシンタックスシュガー
p.r // どっちも { extract p, r } // おなじ
14. カーリー化
sum = { a:Int, b:Int, a+b } sum1 = sum(1, _) v = sum1(2) // v=3
15. カーリー化その2
sum2 = sum(b=2) v = sum2(1) // v=3
16. カーリー化していても展開
{ extract Point(y=2) // abstract x, y=2, r=(略) が展開される r // エラー }
17. x を後付け
{ extract Point(y=2) x=1 r // エラーじゃない }
18. 別々の実態から
{ extract Point(x=1) // x=1, abstract y, r=(略) が展開される extract Point(y=2) // abstract x, y=2, r=(略) が展開される // r の実体が同じなので衝突してもエラーにならない r }
とりあえずここまで