Kotlinショック
Kotlinのドキュメント読んでいます。素晴らしいです。表記がホント凄いですね、、、、。Swiftは出力するコードは速いと思いますが、ちょっと表記がイマイチですね。後発の割には。
Kotlinの表記を見習って幾つかClover2に改良を加えたいと思います。
Clover2ではlist { 1, 2, 3 }がリストのオブジェクト値の表現ですがKotlinではListOf(1,2,3)となっているのは本当に賢いなと思いました。そうか、newキーワードがなかったら、クラスを関数の様に呼んでしまえば、初期化できるんだ。と目から鱗が取れました。listという予約語も必要ないですし、素晴らしいですね、、、、。可変長引数さえClover2に入れればListOf(1,2,3)で実現できますね。本当にKotlinには参りました。
幾つか、Kotlinから表記をClover2に入れたいと思います。
if文が値を返すようにした方が良いですかね。あと関数やメソッドの最後の値がreturnされる。lambda式の第一引数の省略のitとか。
後は型推論が強力ですね。Kotlinは。目指せ、Kotlin!でいきたいと思います。
後方互換性はこの際あまり気にしないようにします。
既にユーザーの方には申し訳ないですが、、、変更点はwikiに書いていきます。
ごめんなさい。
インタプリタの方は大体出来上がっているので、次は言語機能の拡張の作業に移ります。
クラス名の補完
:のあとにクラス名の補完をするように修正しました。
あと昨日のgithubのリポジトリへのプッシュでシェルモードで補完がエンバグしてました。修正しています。
あとはnew の後のクラス名の補完を入れたいのですが、まだ途中です。まあ、ぼちぼちやっていきます。
developのブランチを作って、そこで作業するべきなんですが、masterで作業しています。申し訳ないです。
今日はちょっともう寝ないとヤバイので寝ます。
しばらく朝が早いので。
まあ、ぼちぼち色んな場面で補完が効くように修正していきます。
補完のソースは、かなり乱雑なソース・ファイルになっています。なんか前もreadlineに対するソースファイルは酷かったので、補完というものはこういうものだと割り切って書いています。あまり読まないでください。
それでは enjoy programing!
ローカル変数名の補完、シェルモードのバグを修正
ローカル変数名の補完を入れました。
たぶん。大体の場所で補完は効きます。
ただ、変数のクラス名の補完などはまだ入れてません。
> a:Inte[TAB]
> a:Integer
なんていうやつは入ってません。それをまた入れたいと思います。
:のあとはクラス名の補完が行われるようにしたらいいですね。
それほどは難しくないですね。
ローカル変数の補完は以下のようです。
> if(true) { abcdefghi := "ABC"; abcde[TAB]
> if(true) { abcdefghi := "ABC"; abcdefghi
かなり良い感じになってます。もちろんabcdefghi.[TAB]とするとString型のメソッド名の補完となります。
シェルモードのバグは見つかりにくいもので以下のようなバグが有りました。
> ls | less; 1.toString().toCommand().less()
の1がエラーとなっていました。シェルモード後の文がおかしくなってました。修正しています。
シェルモードのパースはちょっといい加減な感じでまだバグがありそうな予感があります。個人的に使っていってバグが見つかれば修正しますね。
まあ、ぼちぼちですね。かなり補完が良い感じに仕上がってますので、インタプリタとしても使ってあげてください。
しばらく、補完を予想通りの動きに仕上げます。
それが終わったら、ようやく言語機能の拡張に入ります。
お楽しみに。
それでは、enjoy programing!
ブロック内でメソッド名の補完ができるようになりました。
ブロック内でメソッド名の補完ができるようになりました。
とりあえず、補完はほぼ完成しています。
後はローカル変数名の補完ですかね。足りないのは。それを明日以降追加したいと思います。大体は補完が効くのでJavaのIDEにだいぶ近づいた感じです。
しばらく補完をほぼ期待通りの動作にする作業に入りたいと思います。あんまり完璧は無理かもしれません。
それが終わると、やっとdelegateなど言語機能の追加やThreadやSocketなどのライブラリの作成部分に入れます。楽しい部分なので今からワクワクしています。delegateは他の言語にはない様子なのでアイデアを形にするのが楽しみです。詳細は秘密です。楽しみにしていてください。継承の代わりになる強力な言語機能だとは言っておきます。
それでは、enjoy programing!
カレントプログラムの実行をシェルモードに追加。String.clcの見直し。
カレントプログラムの実行をシェルモードに追加しました。
> ./configure --prefix=$HOME --with-optmize
などがシェルモードで動きます。これで一応僕が普段実行するコマンドは全部動くようになりました。現在はClover2をiclover2上で開発しています。
iclover2上で開発しているためStringクラスのチェックも行えました。
ライブラリの仕様が変わってます。subのブロックの引数の順番が変わってます。subのreplaceのブロックは第二引数でしたが末尾になっています。もし、Clover2でコードを書かれていたら変更お願いします。これから、もし、ライブラリの変更があったらwikiのライブラリの変更の章に書いていきますので、一応そこに目を通しておいてください。変更理由はブロックの糖衣構文のためブロックの引数は末尾にあったほうがいいためです。以下のように書けるようになりました。
> "ABC".sub(/A/) { |str:String| return str.append("X"); }
> AXBC
のような感じです。group_stringsも省略できるように改良しました。
しかし、iclover2の補完の出来はまだまだです。ブロック内の変数など補完できるようにしたいです。今日から暫くその作業に入ります。パーサーはClover2のものを使い型を特定できるようにしてJavaのIDEのような補完ができるように改良します。今のところ、独自にパースしているためブロック内などで型が特定できていません。
iclover2が満足できるできになったら、バージョンをあげます。
その後、delegateという継承の代わりのようなものを入れたいと思っています。実装付きインターフェースは入れないかもしれません。delegateとmoduleで十分継承の代りになりそうなので。そのあとはSwiftやKotlinを目指して、ぼちぼち本格的なオブジェクト指向言語を目指して開発していきたいと思います。まだ作り始めて1年半くらいですが、4年後にはSwift並のものを作りたいと思っています。Swiftも開発に4年かかったそうなので。
下地はできています。JITはClover2のコンパイル時にネイティブコードにコンパイルしてしまっていますし、速度的には十分な物が出ています。あとはコンパイラーの改良なので、意外と簡単に終わってしまうかもしれません。まあ、楽しみにしていてください。これからもClover2をよろしくお願いします。
それではenjoy programing!
splitのバグを修正。シェルモードで引数のグロブのバグを修正。シェルモードに環境変数の展開を追加
splitのバグを修正。シェルモードで引数のグロブのバグを修正。シェルモードに環境変数の展開を追加
とりあえず、シェルモードの使い勝手を上げています。自己満ですが、インタラクティブに基礎ライブラリのバグのチェックもできますし、やっぱり自分でも使っていかないと駄目ですね。
String.splitが変な動作していました。修正しました。
後はシェルモードで環境変数を展開するようにしました。
シェルモードでのやり残しは後は
./configure --prefix=$HOME --with-optimize
などのパスを指定する外部コマンドの実行ですね。
それでシェルモードは大体は満足です。
一応今日書いたsplitのデバッグでは
> "A,B,C".split(/,/) {|str:String| return str.append("X"); }
=> { AX, BX, CX }
などが動いています。割りとスッキリした記述でしょう?
型推論と引数のブロックの糖衣構文でだいぶ良い感じになってきました。
まだまだ完成度を高めます。まあ、ぼちぼちですが。
目標はSwiftやKotlinのようなモダンなプログラミング言語です。
インタラクティブモードも完成度を高めていきたいと思います。
まだ補完が完全ではありません。ブロックの中では全然補完が効きませんし。そのあたりもぼちぼち改善していきたいと思います。