ハチのブログ

日常系、技術系色々

comelang2

comelang2という言語を作っています。

 

https://github.com/ab25cq/comelang2

 

#include <comelang2.h>

int fun(int x=123, int y = 234, int z = 345) 
{
    printf("x %d y %d z %d\n", x, y, z);
}

int, string fun2() 
{
    return (1, string("ABC"))
}

struct sData
{
    int a;
    int b;
};

sData*% sData*::initialize(sData*% self, int a, int b)
{
    self.a = a;
    self.b = b;
    
    return self;
}

int putc(int c, FILE* f) version 2
{
    inherit(c, f);
    puts("");
    
    return 1;
}

int main() 
{
    puts("HO!" * 3);             // HO!HO!HO!\n
    puts(xsprintf("%d", 1+1));   // 2\n
    
    3.times { puts(("HO" + "!") * 3); }    // HO!HO!HO!\nHO!HO!HO!\nHO!HO!HO!\n
    
    int xxx = 123;
    
    3.times {
        xxx+=2;
        printf("xxx %d\n", xxx); // xxx 125\nxxx 127\nxxx 129\n
    }
    printf("xxx %d\n", xxx); // xxx 129\n

    var li = ["AAA", "BBB", "CCC"]

    foreach(it, li) {
        puts(it);           // AAA\nBBB\nCCC\n
    }
    
    [1,2,3].each {
        printf("%d\n", it);   //1\n2\n3\n
    }

    var m = ["AAA":1, "BBB":2, "CCC":3]
    
    foreach(key, m) {
        var item = m[key];

        printf("%s %d\n", key, item); // AAA 1\nBBB 2\nCCC 3\n
    }

    puts("ABC".substring(0,1));   // A\n

    int fd = open("ABC", O_RDONLY).except {
        fprintf(stderr, "can't open ABC");
        exit(1);
    }

    3.times {
        puts("HELLO METHOD BLOCK");
    }

    var li2 = [1,2,3]

    li.filter { return it > 1; }.each {
        printf("%d\n", it);       // 2\n3\n
    }
    
    var li2 = ["1", "2", "3", "4", "5"]

    [3,1,2,7].filter { return it > 2; }.each { printf("%d\n", it); }   // 3\n7\n
    
    var ma1 = ["AAA":1, "BBB":2, "CCC":3];
    
    if(ma1["AAA"] == 1 && ma1["BBB"] == 2 && ma1["CCC"] == 3) {
        puts("OK");
    }
    
    fopen("AAA", "w").fprintf("ABC\n").fclose();
    
    fopen_block("AAA", "r") {
        it.read().print();   // ABC\n
    }
    
    puts("AAA".read());   // ABC\n\n
    
    unlink("AAA");
    
    stdin.readlines().map { return it.strip(); }.join(",").printf("[%s]\n"); // if stdin is aaa\nbbb\nccc --> [aaa,bbb,ccc]\n
    
    int, int, char* t1 = (1,2,"ABC");
    
    xassert("tuple value test1", t1.v1 == 1 && t1.v2 == 2 && t1.v3 === "ABC");
    
    xassert("string equals test1", "ABC" === "ABC");
    xassert("operator overload test", "ABC" * 2 === "ABCABC");
    xassert("operator overload test", "ABC" + "DEF" === "ABCDEF");
    xassert("operator overload test2", [1,2] + [3] === [1,2,3]);
    xassert("operator overload test3", [1,2] * 2 === [1,2,1,2]);
    
    var z = [1,2,3];
    
    xassert("operator overload test", z[0] == 1 && z[1] == 2 && z[2] == 3);
    
    z[1] = 22;
    
    xassert("operator overload test", z[0] == 1 && z[1] == 22 && z[2] == 3);
    
    var zz = ["AAA":1, "BBB":2, "CCC":3];
    
    xassert("operator overload test", zz["AAA"] == 1 && z["BBB"] == 22 && z["CCC"] == 3);
    
    zz["DDD"] = 4
    
    xassert("operator overload test", zz["AAA"] == 1 && z["BBB"] == 22 && z["CCC"] == 3 && z["DDD"] == 4);
    
    fun(y:2,x:1);  // print x 1 y 2 z 345
    
    putc('X');     // print X\n
    
    var l, m = fun2();
    
    xassert("multiple return", l == 1 && m === "ABC");
    
    "12345\n".write("AAA");
    "12345\n".write("AAA", append:true);
    
    printf("AAA".read());  // print out 12345\n12345\n
    
    var data = new sData(3,5);
    
    xassert("class test", data.a == 3 && data.b == 5);
    
    var z = [new sData(1,2), new sData(3,4)];
    
    int x = 2;
    ([1,2] + [3]).each {
        printf("%d\n", it*x);  // 1\n6\n9\n
        x = 3;
    }
    
    printf("x %d\n", x);   // x 3\n
    
    ["1","7","3","2","9"].map { return atoi(it); }.each { // 1\n7\n3\n2\n9\n
        printf("%d\n", it);
    }

    return 0;
}
 

comelang version 1.0.6 リリース

https://github.com/ab25cq/comelang

Default parametor values, parametor labels

#include<stdio.h>

int fun(int x = 123, int y = 345, int z = 456) 
{
    printf("x %d y %d z %d\n", x, y, z);
}

struct sData 
{
    int x;
    int y;
    int z;
};

int sData*::fun(sData* self, int x = 123, int y = 345, int z = 456)
{
    self.x = x;
    self.y = y;
    self.z = z;
}

void sData*::show(sData* self)
{
    printf("x %d y %d z %d\n", self.x, self.y, self.z);
}

int main(int argc, char** argv) 
{
    fun();           // x 123 y 345 z 456 are outputed
    fun(y:2);        // x 123 y 2 z 456
    
    fun(y:1, x:3);   // x 3 y 1 z 456
    
    fun(1);          // x 1 y 345 z 456
    fun(1,2);        // x 1 y 2 z 456
    
    sData data;
    (&data).fun(1,2,3);
    (&data).show();   // x 123 y 345 z 456
    
    (&data).fun(y:2); // x 123 y 2 z 456
    (&data).show();   // x 123 y 2 z 456
    
    (&data).fun(1);
    (&data).show();   // x 1 y 345 z 456
    
    return 0;
}

Comelang version 1.0.5リリース

MacOSで動作を確認しました。vinとyappyの動作も確認しています。

clang, llvmXCodeコマンドラインツールをインストールしてください。

その他のライブラリはHomebrewを使ってください。

 

PATHやライブラリーの環境変数については、他に譲ります。

 

export PATH="/usr/local/opt/llvm/bin/:$PATH"

export LDFLAGS="-L/usr/local/opt/llvm/lib"

export CPPFLAGS="-I/usr/local/opt/llvm/include"

 

を~/.profileに書けば動くと思います。

 

https://github.com/ab25cq/comelang

Comelang version 1.0.2

リリースです。

 

フリーソフトウェアプログラマーを辞めると言いましたが、まだ続けます。

Pythonクローン地道に実装していきます。

 

Comelangは右辺値の代入時に代入する変数に%がないとエラーとなるようになりました。

これでかなりコンパイル時に動的エラーを検出できます。

オリジナルのヒープシステムはかなり完成度が高まっています。

BoehmGCでのヒープの管理も可能ですが、オリジナルのヒープシステムも使いやすいので

使ってみてください。GCが無いのでかなり高速です。

 

viクローンはvinディレクトリにPythonクローンはyappyにあります。

 

Comelang

https://github.com/ab25cq/comelang

Comelang version 1.0.0リリース

とりあえず、Pythonクローンのyappyが動いたので完成とします。

最終的にはオリジナルのヒープシステム以外にBoehmGCを使ったライブラリも用意しています。

 

gc_list<char*>* li = new (GC) gc_list<char*>.initialize();

 

li.push_back(gc_string("AAA"))

li.push_back(gc_string("BBB"))

 

などです。エディッターのvinの方は特にバグがなく安定しています。

yappyの方は途中ですが、もうプロジェクト終了とさせてもらいます。

とりあえず、Pythonクローンのサンプルとして参考にしていただければ良いですね。

 

もう僕はフリーソフトエンジニアとしては、この作品で終わりとしたいと思います。

まだ未練たらしく改良を重ねると思いますが、もう仕事や私生活で無理なく頑張りたいと思います。

暇になったらPythonPHPのテストコードを書いてPythonPHPを遊びではなく勉強として学びたいと思ってます。

 

思えば僕はプログラミングが遊びだった頃からパソコンをやっていました。

もうパソコンは遊び道具ではなく、仕事や勉強のものとなりました。

僕ももう遊びとしてはプログラミングができません。

仕事としてプログラミングしたいと思います。

金にならないコードはもう書きたくないです。

金にならねぇコードは書かねぇで生きたいと思います。

 

では。

 

https://github.com/ab25cq/comelang

 

viクローンはvinディレクトリにPythonクローン(未完)はyappyディレクトリにあります。

comelang version 0.9.8.1リリース

だいぶバグが減りました。エディッターも安定したかな。

ちょっとデバッグしていきます。あとはPythonクローン動かすことですが

こちらはBoehmGC前提なんで、ちょっと新しいコンパイラに移植作業が必要ですね。

仕様変えてすみませんね。より良いものを届けたくて。

version 1.0.0に向けてぼちぼちやっていきます。