新しいプログラミング言語

新言語登場

新しいプログラミング言語を作っています。

mandel59/psil · GitHub

現状はこんな感じ。

let
  x: 'ハロー'
  y: add(+'1', +'9')
  z: {a: x; b: y}
debug.print "\(z.a)ワールド \(z.b)"

……でも内容はこれから色々変えるので、多分このままの形では残りません。

現状はLua VM上に寄生して実装されています。

コンセプト

予約語なんてなかった

予約語は無いです。使いたいライブラリで使っている識別子と被ったら困るし……

括弧を削減します

括弧の代わりにインデントや中置の記号が使えるので活用してください。

各種機能拡張の実現

構文木はいじれるというか、構文木をいじるところからプログラミングして欲しいです。毎日DSL作ろう。

パラダイム選択可能な言語を目指す

現状は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)

あとシンタックスシュガーとかリテラルとかがあるけど、色々未定なので省略。