agehama's diary

年一更新

自作言語ボツ構文集

自作言語を作っていて、一度考えはしたものの結局ボツになった構文。

1. return return x

意味:呼び出し元の呼び出し元に x を返す
ボツの理由:実用性がない

id = (x -> return return x)

func = (n ->
    sum = 0
    for i in 1:n do(
        sum += id(i)
    )
    return sum
)

func(4) //なぜか10ではなく1が返る

もちろん return はいくつでも繋げられる。
ちなみに continue continue や break break は普通に使いどころがありそうなので入れようか迷っている。

2. 半開区間をループに使う

xs = [1,2,3,4,5]

sum = 0
for i in [0, xs.size) do(
    sum += xs[i]
)

意味:0 から xs.size-1 までの間 i に 1 ずつ足しながら do 以下を実行する
ボツの理由:テキストエディタで括弧の対応が狂う

3. 閉区間をループに使う

xs = [1,2,3,4,5]

sum = 0
for i in [1, xs.size] do(
    sum += xs[i-1]
)

意味:1 から xs.size までの間 i に 1 ずつ足しながら do 以下を実行する
ボツの理由:リスト記法と衝突してるので、リスト走査(foreach的な)と紛らわしい気がする

4. 1..10

意味:1~10 の範囲を表す値
ボツの理由:数字のパースにライブラリ組み込みのやつを使ったら、 1. を読んだ時点で浮動小数点数の1と解釈してしまうみたいな感じだった気がする。
とりあえず範囲は 1:10 で表すようにしたけどこれはこれで別の構文と衝突しているのでやっぱり .. にするかもしれない。

5. タプル

p1 = (1, 2)
p2 = (7, 3)
v = p2 - p1

ボツの理由:カンマ区切りの式を括弧で括ったものと完全に衝突する
丸括弧で括ったデータ構造が作れると座標の表記を数学に合わせられるので入れたかった
リストでもそんなに困らない。

6. 関数/演算子オーバーロード

//2次元ベクトルの和と差
operator(+) = (v1 is vec2, v2 is vec2 -> vec2{x: v1.x + v2.x, y: v1.y + v2.y})
operator(-) = (v1 is vec2, v2 is vec2 -> vec2{x: v1.x - v2.x, y: v1.y - v2.y})

//行列積
operator(*) = (m1 is mat2x2, m2 is mat2x2 -> mat2x2{
    a: m1.a*m2.a + m1.b*m2.c, b: m1.a*m2.b + m1.b*m2.d, 
    c: m1.c*m2.a + m1.d*m2.c, d: m1.c*m2.b + m1.d*m2.d
})

ボツの理由:型がないとさすがに厳しそう
この言語に静的型は無く、型のように見える vec2 と mat2x2 はただの値。
引数に a is b と書くと与えられた引数 a とひな型となる値 b の構造を比較して合ってれば関数を実行するという感じになる。
でもやっぱり実際に走らせるまでどの関数が呼ばれるかわからないのは怖いと思うのでやめた。