コーディング合宿

部のコーディング合宿に行ってきた。2泊3日でひたすらコーディングするという合宿。

なぞの言語処理系ができた。

こんな感じの言語。//または全角スペースがコメントの開始記号(Shift-JIS限定)。

// gm sample
print("Hello, World!");
print("// // //\n");



 THE COMMENT☆
def fib = #(n) {        // fib
    if (n <= 1) {
        1;
    } else {
        fib(n - 1) + fib(n - 2);
    };
};
print("fib(10) = ", fib(10));
print();


 ?で終わる識別子
def zero? = #(n) {
    n == 0;
};
print(zero?(3));



 代入とかラムダ式とか
def x = 3;
print(x);
x = 10;
print(x);
print(#(a) { a * a; } (x));
set!(x, 20);
print(x);
print();



 配列操作とか
 ループは再帰で。
def v1 = [1, 3, 5, 7, 9, 11];
print("v1 = ", v1);
print("v1[1 + 2] = ", v1[1 + 2]);

def show-array = #(array, x, y) {
    if (x < y) {
        print(x, ": ", array[x]);
        show-array(array, x+1, y);
    };
};

show-array(v1, 0, 6);

def double-array = #(array, x, y) {
    if (x < y) {
        array[x] = array[x] * 2;
        double-array(array, x+1, y);
    };
};

double-array(v1, 0, 6);
print(v1);
print();



 素数生成
def primes = make-vector(100, 1);
def seive = #(i) {
    def iter = #(j) {
        if (j < vector-length(primes)) {
            primes[j] = 0;
            iter(j + i);
        };
    };
    if (i < 100) {
        if (primes[i] == 1) {
            iter(i+i);
        };
        seive(i+1);
    };
};
def show-primes = #(i) {
    if (i < vector-length(primes)) {
        if (primes[i] == 1) {
            print(i);
        };
        show-primes(i+1);
    };
};
seive(2);
print("primes in [2..100]");
show-primes(2);
print();

出力は

Hello, World!
// // //

fib(10) = 89

#f
3
10
100
20

v1 = #(1 3 5 7 9 11)
v1[1 + 2] = 7
0: 1
1: 3
2: 5
3: 7
4: 9
5: 11
#(2 6 10 14 18 22)

primes in [2..100]
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97