Clover2開発日誌

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

3.0.8リリース

スクリプトの自動コンパイル機能を入れました。clファイルはコンパイルせずに直接clover2で実行できます。 > vim HelloWorld.cl println("HELLO WORLD"); > clover2 HelloWorld.cl HELLO WORLD 拡張子の変更。 普通のソースファイル cl --> clクラスのソース…

3.0.7リリース

Anonymousクラスにisメソッドを作りました。以下のように使います。 a:Anonymous = "ABC"; if(a.is("Integer")) { #aはInteger}elif(a.is("String")) { #aはString} #aはanonymous です。ちょっとプルリクエストがありましたが、マージすると謎のバグにエン…

version 3.0.6 リリース 2017/11/12

メソッドブロック関連のメモリのバグを修正しています。稀にセグメンテーション違反が起きる致命的なバグなのでダウンロードをお願います。JITでメソッドのreturn文の省略が可能になりました。これで知っているバグは全部修正できました。3.0.6を安定版とし…

version 3.0.5d リリースしました。

やっぱりこっちもリリース情報書いておきます。twitterとの連携が便利なので。 REPLでほとんど期待通りの補完が行われます。メソッドブロックの型推論も含めて。結構便利なので、使ってみてください。 でも、まだバグがあるかもしれません。readlineのプログ…

ここの修正内容を書くのはやめておきます。wikiのリリースノートを見てください

ここの修正内容を書くのはやめておきます。wikiのリリースノートを見てください ということです。こちらは言語の実装予定の機能や所感などを書いていきますね、、、。

version 3.0.5リリース

version 3.0.5 リリース 2017/11/07 シェルモードが悪さをしてslist{1,2,3}.select { it > 1 }などが動きませんでしたが修正しました。コンパイラでコマンド名をPATHからサーチしてからシェルモードに入るようにしています。

モジュールのエラー表示をわかりやすくしました。

エラーが出ているmoduleの行番号が表示されます。 ちょっと今まではありえないくらい不親切でした。 修正。

色々便利に

sortable_list{1,2,3}がslist{1,2,3}, equalable_list{1,2,3}がelist{1,2,3}と省略できるようになりました。sortable_array, equalable_arrayも同様です。 a := 123; "a is \{a.toString()}"がa := 123; "a is \{a}"と書けるようになりました。(toStringが自…

メソッドブロックの型推論が完成しました。

とりあえず、報告まで。詳細はまた追ってwikiやブログに書き込みます。 list { 1,2 3 }.map { it.toString() }はList<String>を返します!!!!</string>

メソッドやlambdaのreturn文の省略

前から特に意図無く入っていた機能ですがメソッドやlambdaのreturn文は省略することができます。 class ClassA { def initialize() {} def get():int { 123; } } a := new ClassA(); a.get() == 123 は真です。 lambdaも戻り値を指定した場合は最後に実行さ…

delegateを入れました。

delegateを入れました。 class ClassA { def initialize() { } def show() { println("HELLO delegate"); } } class ClassB { field: delegate ClassA; def initialize() { self.field = new ClassA(); } } a:ClassB = new ClassB(); a.show(); みたいな感じ…

List.mapが型チェックをするようになりました。

List.mapが型チェックをするようになりました。 l: List<String> = list { 1, 2, 3 }.map() {|n:Integer| return n.toString(); } はコンパイルできます。 これまで通りのAnonymousを返すコードもそのまま動きます。 一応互換性がある変更点です。 KotlinのList.map</string>…

method genericsを入れました

新しい機能としてmethod genericsを入れました。 def <T:Object,R:Object> method(a:T, b:R) { } のように定義します。詳しくはwikiで。 これでList.mapの記述が型チェックを行えるようになります。 まだバグがあるかもしれません。 List.mapはまだ定義してません。明日以降しま</t:object,r:object>…

LLVMのリファクタリングが一応終了

LLVMのJITのリファクタリングが一応終了しています。 ちょっとは読みやすくなったかと。 ついでにlist { 1, 2, 3 }.toString().println();がJITでは動かなかったですが、デバッグしています。 これでようやくKotlinに近づけるコーディングを始められます。 …

LLVMのリファクタリング

LLVMのリファクタリングを行ってます。 しばらく時間がかかります。 developリポジトリで開発しています。 シンプルなソースにしたいと思います。 具体的にはLVALUEに格納している値の種類を追加しています。 そうするとだいぶソースが整理されるので。 今ま…

バグ修正中です。

JITでlist { 1, 2, 3 }.toString().println()が動きません。只今修正中です。 少しの間JITをリファクタリングします。もう少し読みやすく整理しますね。リポジトリはdevelopで作業しています。 あとデバッグ時にスタックの値が表示できないのをなんとかした…

言語仕様の変更点

ブロックが block { a := 123 } などから { a := 123 } に変更されています。ブロックは戻り値を返すようになりました。最後に実行された式の値がブロックの戻り値です。a := { 123 }; System.assert(a == 123)は真です。ブロックの表記が変わったので配列の…

if文が戻り値を返すようになってます。

if文が戻り値を返すようになってます。JIT対応。 > a := if(true) { 1 } else { 2 } > a 1 となります。JITでも対応しています。 もちろん、インタプリタでは > if(true) { "ABC" } else { "DEF" }.[TAB] でString型のメソッド補完も行います。 次はブロック…

Kotlinショック

Kotlinのドキュメント読んでいます。素晴らしいです。表記がホント凄いですね、、、、。Swiftは出力するコードは速いと思いますが、ちょっと表記がイマイチですね。後発の割には。 Kotlinの表記を見習って幾つかClover2に改良を加えたいと思います。 Clover2…

クラス名の補完

new, :の後にクラス名の補完をするようになりました。Generics対応です。 だいぶJavaのIDEに近づいてます。 ちょっと外部コマンド名の補完がどこでも出来てしまうので、補完するときに邪魔になりますね。うーむ。ちょっと対策を考えます。 Clover2は実際その…

クラス名の補完

:のあとにクラス名の補完をするように修正しました。 あと昨日のgithubのリポジトリへのプッシュでシェルモードで補完がエンバグしてました。修正しています。 あとはnew の後のクラス名の補完を入れたいのですが、まだ途中です。まあ、ぼちぼちやっていきま…

ローカル変数名の補完、シェルモードのバグを修正

ローカル変数名の補完を入れました。 ほとんどJavaのIDEのような使い心地になってます。 たぶん。大体の場所で補完は効きます。 ただ、変数のクラス名の補完などはまだ入れてません。 > a:Inte[TAB] > a:Integer なんていうやつは入ってません。それをまた入…

ブロック内でメソッド名の補完ができるようになりました。

ブロック内でメソッド名の補完ができるようになりました。 とりあえず、補完はほぼ完成しています。 後はローカル変数名の補完ですかね。足りないのは。それを明日以降追加したいと思います。大体は補完が効くのでJavaのIDEにだいぶ近づいた感じです。 しば…

カレントプログラムの実行をシェルモードに追加。String.clcの見直し。

カレントプログラムの実行をシェルモードに追加しました。 > ./configure --prefix=$HOME --with-optmize などがシェルモードで動きます。これで一応僕が普段実行するコマンドは全部動くようになりました。現在はClover2をiclover2上で開発しています。 iclo…

splitのバグを修正。シェルモードで引数のグロブのバグを修正。シェルモードに環境変数の展開を追加

splitのバグを修正。シェルモードで引数のグロブのバグを修正。シェルモードに環境変数の展開を追加 とりあえず、シェルモードの使い勝手を上げています。自己満ですが、インタラクティブに基礎ライブラリのバグのチェックもできますし、やっぱり自分でも使…

シェルモードの改良

シェルモードの改良をしています。make && make installなどシェルモードで&&と||が動きます。 あとはCommandクラスにまだバグがあったので修正。SIGPIPEのブロックをしていなかったため存在しないコマンド名を実行するとパイプのwriteでシステムが落ちてい…

シェルモードの改良

シェルモードの改良をしています。make && make installなどシェルモードで&&と||が動きます。 あとはCommandクラスにまだバグがあったので修正。SIGPIPEのブロックをしていなかったため存在しないコマンド名を実行するとパイプのwriteでシステムが落ちてい…

Commandクラスのバグを修正

ちょっとCommandクラスが不安定だったので修正しました。 そのためmbstowcsの仕様が少し変わってます。必ずnull-terminatedされます。引数の数も変わってます。 後はシェルモードでls -al | less, egrep ^p src/*.cなどが動くようになりました。内部的には単…

文字列への式の埋め込み

文字列への式の埋め込みを入れました。 > a := 123 123 > println("abc\{a.toString()}def"); abc123def のようになります。Rubyの#{}じゃなくてSwiftの\{}を使っています。いろいろ考えましたけどクォートができる方が良いなと思いまして。 正規表現、Path,…

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

タイトルの通りです。 シェルっぽくなってきました。 後個人的な不満は make && make install && make test egrep str src/*.c ./configure --prefix=$HOME の3つが通らないところですね。 上記の3つはClover2の構文では実行することが出来ます。 make && ma…