Clover2開発日誌

Clover2というJavaのように静的な型を持つRubyのようなコンパイラ+仮想マシンの開発日誌です。LLVMでJITもします。https://github.com/ab25cqにて開発しています。

文字列への式の埋め込み

文字列への式の埋め込みを入れました。

 

> a := 123

123

> println("abc\{a.toString()}def");

abc123def

 

のようになります。Rubyの#{}じゃなくてSwiftの\{}を使っています。いろいろ考えましたけどクォートができる方が良いなと思いまして。

正規表現、Path, Bufferへも同じように埋め込めます。

正規表現ではクォート出来ないことが問題になるかもしれないので今からクォートができるように修正したいと思います。\\{ -> \{と解釈されるようにします。

 

あと今からStringクラスにto_regex()を入れます。無いので不便でした。あとは

> egrep ^p src/*.c

とREPLでグロブが使えるように変更したいと思います。

とりあえず、自分で使っていって不便な点を解消していきたいと思います。終わればversion 3.1.0としてリリースしたいと思います。

一応の完成の目処ですね。とりあえず、しばらくREPLの使い勝手を上げる作業に入ります。

cd, fg, jobsを入れました。

タイトルの通りです。

シェルっぽくなってきました。

 

後個人的な不満は

make && make install && make test

egrep str src/*.c

./configure --prefix=$HOME

 

の3つが通らないところですね。

上記の3つはClover2の構文では実行することが出来ます。

make && make install && make testはmake("--controlling-terminal").toBool() && make("--controlling-terminal", "install").toBool() && make("--controlling-terminal", "test")

egrep str src/*.cはegrep("str", p"src/".glob("*.c"))

./configure --prefix=$HOMEはSystem.system("./configure --prefix=$HOME)になります。

ただ、タイプが面倒くさいですね。

糖衣構文を用意したいと思います。

ls -al | lessなどのパイプも入れてしまおうかと思ってます。内部的にはls("-al").less()と変換されるようにして。

 

ただ、果たして、これが良いことなのかは分かりません。

2通りの構文があるので、ユーザーは混乱するかもしれませんね。

 

まあ、僕が使っていて不満な点は解消していきたいと思います。

またユーザーの方も不満がある点はgithubのメッセージで送ってもらえるとうれしいです。

インタプリタの補完のバグを修正

上記のとおりです。概ねインタプリタの補完のバグは修正できました。ただ、ソースがあまりにも酷いのでバグがあるとは思います。(src/interpreter.c)

後、ブロックの引数に対する補完ができません。これはバグというより放置している問題ですが。

やっぱりparser.cやらnode.cを使って一度Clover2自身でパースして、補完すべきなんでしょうね。そうすればブロックの引数の型なども分かるので、補完することができます。今だとinterpreter.cで独自にパースして型を得ているので、ブロックの引数に対してはどうしようもありません。

また、大幅にソースを改良したいと思います。

一応今でも大体の文法に対して補完が効くと思います。

後は思ったのはcdが無いですね。また明日Command.cdとCommand.fgを追加したいと思います。どんどんインタプリタの使い勝手を上げていきます。

自身でもシェルの代わりになるREPLとして使い始めてます。

色々と不満が出てますが、徐々に解決していきますね。

それでは。enjoy programing!

クロージャーのバグ修正

クロージャーで親の変数が間違った値に変更されるバグを修正しました。make testで検出できてませんでした。一応テストを追加しておきました。

これで、めぼしいバグは大体修正できました。

僕が見つけているバグはもう無いです。

 

Clover2の開発にiclover2を使い始めてますけど、いくつか不満が出てます。

まず、CTRL-Zでプログラムをサスペンドしたときにやっぱりfgだけで復帰させたいですね。いちいち、Clover.jobs.items(0).forground()と打つのは面倒くさいです。これは特に構文をいじらなくても、Commandクラスにfgというメソッドを作ればいいと思います。

次に、make && make install && make testなどと外部コマンドに&&と||が欲しいですね。これは糖衣構文を作らないと無理です。

(今でも一応、make("--contorolling-terminal").toBool() && make("--controlling-terminal", "install").toBool() && make("--controlling-terminal", "test"で同じことは可能ですがタイプが面倒くさいです)

後は、./configure などとカレントプログラムの実行ができないのも不満ですね。これも糖衣構文が必要になります。今のところyashと実行してシェルで実行しています。

 

とりあえず、デバッグが済んだので、インタプリタを使いやすいように改良していきます。

1行でのシェル風の記述に補完を入れました。

上記の通りです。

 

> ls -al src/m[TAB]

> ls -al src/main.c

 

みたいな感じです。まんまシェルですね。

個人的にもユーザーインターフェースとして使い始めてます。シェルの代りに使えるようなREPLを目指してます。

注意してほしいのは一行での記述の場合のみ、括弧の省略が可能という点です。パイプのような処理をしたい場合は

 

> ls("-al", "main.c").less()

 

などとしないといけません。

まあ、糖衣構文ですね。シェルで開発しているとvim src/man.cなんてものは何回でも入力するので、やっぱり1行の場合はvim("src/main.c")なんて入力してられませんしね。いくら補完があるとは言え。

 

あとはmake && make install && make testもよく入力するので、それを楽にできるようにも考えてます。一応前対策したような。make("--controlling-terminal").toBool() && make("--controlling-terminal", "install").toBool() && make ("--controling-terminal", "test"),toBool()でしたっけ。ちょっとタイプが面倒くさいですね。記号を用意したほうが良いんでしょうかね。それか補完してくれるようにか。まあ、自分で使っていって、不都合を感じたら、ぼちぼち改良していきます。目指せ次世代シェル!です。

 

あとブロックオブジェクトにバグがあるので、それを修正したいと思います。クラスのコンスタントプールのバグは今日修正しています。稀にコンパイルが落ちていたことがあったと思います。今日たまたま再現しまして修正しておきました。

 

それでは。

enjoy programing!

シェルのような記述

Commandクラスのメソッドが一つだけの場合シェルのような記述を許すようにしました。

 

> ls -al src/main.c

-rw-rw-r--. 1 ab25cq ab25cq 1098  9月 18 08:01 src/main.c

> vim src/main.c

などです。まだiclover2でのファイル名の補完は出来ませんが明日以降補完ができるようにします。

 

あとJITでclosureを使うとローカル変数がおかしくなるバグが見つかっています。(code/block5.clでテストしていますがテストが失敗します)

 

明日以降修正します。

 

とりあえず、しばらくはバグを修正したりもしますが、インタプリタの使い勝手を良くする作業をします。

もともとClover2を作り始めた理由はシェルの代わりになる物が作りたいという動機でした。シェルってもう古臭くないですか?xyzshというRubyのようなコマンドが使えるシェルやmfiler2, mfiler3, mfiler4というCUIファイラを作っていた理由もそれでした。その過程で思ったのはJavaIDEのような補完があるインタプリタがあればシェルの代わりに使えるのではないかということでした。それを実現するためインタプリタをしばらく改良します。

自分でもシェルの代わりにiclover2を使ってClover2の開発をしたいと思います(再帰開発)

 

自分で使ってみるClover2も楽しみです。それでは。満足する物が作れたらversion 3.1としてリリースしたいと思います。