新しいプログラミング言語
新言語登場
新しいプログラミング言語を作っています。
現状はこんな感じ。
let x: 'ハロー' y: add(+'1', +'9') z: {a: x; b: y} debug.print "\(z.a)ワールド \(z.b)"
……でも内容はこれから色々変えるので、多分このままの形では残りません。
現状はLua VM上に寄生して実装されています。
コンセプト
括弧を削減します
括弧の代わりにインデントや中置の記号が使えるので活用してください。
パラダイム選択可能な言語を目指す
現状はLuaの関数をそのまま叩けるようにしてあるだけなんですけど、将来的には自前のライブラリでJavaScriptとか他の言語に変換できるようにしたいです。あと静的型とか型推論とか付けたい。
文法
大切なのは次のデータ構造を作る演算子です。
# | Operator | Name | Property |
---|---|---|---|
1 | x . y |
strong cons | left-associative |
2 | x ` y |
strong apply | left-associative |
3 | x , y |
strong tuple | |
4 | x : y |
cons | right-associative |
5 | x ! y |
apply | right-associative |
6 | x ; y |
tuple |
consとapplyは二項演算子で、強い演算子は左結合、弱い演算子は右結合です。
tupleは多項演算子で、連ねた数の要素からタプルを構築します。
強い演算子と弱い演算子は結合の強さと方向以外は同じ意味を持っています。
consとapplyは構造的な違いはありませんが、処理系側では区別して扱われます。
strong apply演算子は省略できます。
x y = x ` y
括弧を使って、結合の順序を指定できます。
a!b!c = (a!(b!c)) a b c = ((a!b)!c) a!b:c = (a!(b:c)) a b:c = ((a!b):c)
strong tupleとtupleを一緒に使うと、タプルのタプルになります。
a,b;c,d,e;f,g = ((a;b);(c;d;e);(f;g))
インデントによる構造
改行とインデントも構造を表します。
alpha beta gamma delta epsilon zeta eta = ((alpha!beta)!((gamma!(delta;epsilon;zeta));eta)) menu file: item new item open menu edit: item undo item redo = (((menu!file):((item!new);(item!open)));((menu!edit):((item!undo);(item!redo))))
演算子から始まる行は、インデントレベルが同じ直前の行を括弧でくくって、行を継続します。
foo bar ` baz qux = (((foo!bar)!baz)!qux) foo bar ! baz qux = ((foo!bar)!(baz!qux)) alpha beta gamma delta ! epsilon ! zeta = (((alpha!beta)!((gamma!delta)!epsilon))!zeta)
あとシンタックスシュガーとかリテラルとかがあるけど、色々未定なので省略。