プログラミング言語 soreit(それいと)

日曜寝るまでに実装できたところまでで公開してみようと思ってて、まあ、ちょうどいいくらいなので、書いときます
ilog
まだ思いっきり途中なので、わざわざダウンロードしたりビルドしたりしてまで見るほどでもないかと思うけど、実装したっていう証拠のためだけに置いときます。test/soreit/*.ilogが実装。


ilog1をビルドしたあと、
$ ./ilog1 --script-load-path=test/soreit --script-file=test/soreit/soreit.ilog a.soreit
こんな感じで実行。


久し振りにGCCのソースと格闘してたんだけど、最適化がよくわからんかったので、O1付けると落ちます。注意。


と、まあ、そういうのはいいとして、プログラミング言語soreitは名前推論


型を見たほうがよっぽど何をする関数なのかわかりやすいですし。人間に前者を書かせて、前者から後者を処理系が推論するのが型推論ですが、型推論を期待したせいで後者(型情報)が書かれていないソースは、あまり読みたいものではないです。
というのが、まったくそのとおりだと思ったあまり、インスパイヤされて思い付いた言語です。以下のような特徴が。

  • 名前推論


それだけ…?いや、アレですよ。ナンバーワンよりオンリーワンです!!(ちょっと違う)


Nikesと違って、新たに言語を作るのは、識別子やら構文やらをそれっぽくすることによって、Nikesでは難しい部分が簡単にできちゃったりできなかったり。と、そんな感じの言語です。実装はまだちょっとだけです。これから頑張ります。「それはItです」を略して「soreit」と、おぼえてください。いや、おぼえなくていいです。


基本的な構文はa24zっぽいものを。結構あれは気に入ってるので。

def fact( i: Int ) : Int
	if i < 2:
		return i
	else:
		return i*fact( i )

これが基本。ブロックはインデントで。(ちなみに、この例は今のバージョンだとSEGVします)
a24zと違って、識別子にはルールをつくる。変数は小文字か_だけ。型の識別子は頭一文字大文字で_を使えない、としておく。

Int : 型
int : 変数
Nanika_Kata : 使えない
sugoi_hensu : 変数
nanikaHensuu : どうしようか…変数にしてもいいんだけど

これは区別できればいいんだけど。なんか制限が大きいほうが後々やりやすいことがあるかもしれないし、無いかもしれない。


名前省略記号'\'

def add\ ( i: Int, j: Int ) : Int
	return i+j

名前のあとに'\'を付けると型から名前を考えてくれる。この場合、add_int_int。このレベルでは推論とは言わないような気がする。オブジェクト指向な言語じゃないと恩恵が少ないような気がするけど、それはそのうち考える。

    this.add\ ( new MouseListener() ... ) 

こんな感じで。


変数宣言はこんな感じ

def nanika( i: Int ) : Int
	i = ...
	let: 
		# ここが変数宣言
		a:Int := int_value()
		b:Float := float_value()
	in:
		return a + int_from\( b )

んで、もちろん、これは型を書かなくても

def nanika( i: Int ) : Int
	i = ...
	let: 
		a := int_value()
		b := float_value()
	in:
		return a + int_from\( b )

こうも書ける。さらに、これは、

def nanika( i: Int ) : Int
	i = ...
	let: 
		a := int_value()
		b := float_value()
	in:
		# _ を書いたときは、一番内側のスコープの
		# ソレっぽい変数をそれにする
		return _ + int_from_float( _ )

こう書けて(未実装)、それは、さらに、

def nanika( i: Int ) : Int
	i = ...
	let: 
		int_value()    # いっそ名前も省略しちゃって
		float_value()
	in:
		return _ + int_from_float( _ )

こうも書ける。と、いうのはやりすぎか…

def nanika( i: Int ) : Int
	i = ...
	let: 
		int_value()
		float_value()
	in:
		# Int Float は一意に定まる
		return Int + int_from_float( Float )

これでも。(これは実装済み)


あんまり推論って感じはしないかも。補助っぽい?名前補助?まあいいや。
元ネタでは、[add Mouse Listener]に分解して、そっから推論ってネタがあったので、そのぐらいやると良いのかもしれない。だけど、それをやると、意図しない名前が出てきたりとかするかもしれない。いや、実装するのが面倒なだけなんだけど…


まだまだ妄想段階なので、もうちょっと考える。というか、その前に最適化の謎を解かないと。tree_ann_dて何?