arcturus

自作言語のインタプリタです. 構文木を巡回するところは完全に一からオリジナルで書いたので, バグが次から次へと発生してしまい, 手がつけられなくなってしまいました.

文法

メソッド呼び出し

a := { i : Int => Int i }
a(1)

stack trace

Call a 1 : LiteralNode
stack a
1 evaled 1 : Int
params type matches a’s args type
in scope a
define i in a
a lookup i = 1
eval statements
return = statements.last
unstack
unscope

& i returns Refnode 参照渡し

行列型 Mat< T>

Array<Array<T>> と区別

mat := {| 1 2 |, |3 4|}
det := mat.det

パイプ演算子 |>

infix |> := { left: T, right: R => right(left) }

関数合成演算子 |:|

infix |:| := { left: A -> B, right: B -> C => right(left(it)) }

コンセプト

f := { list : T < Array

合成型 Either<A, B>

Array from Generator で値生成

標準正規分布とか

xs: = Array(10) { it * 2 }
xs: = Dist.nrd(0, 1).sample(10)

パターンマッチ

https://qiita.com/egisatoshi/items/38f7f8aef32ac67ccd4b

Ex. 三連続の数

? #[1, 2, 3, 4] => ‘n, n+1, n+2’-> p(n) ?

Ex. 2から始まる

? #[1, 2, 3, 4] => ‘2, *’ -> p($) ?

無限リスト

(3..).take(2) |> print
// [3, 5]

テンプレート文字列

“Answer is ${ans}.”

クラス

class A(i: Int)
instance: = A(2)

トレイト

#Addable = plus
#Subable = minus
#Arithmeticable = plus, minus, product, div
class Number(n: Int)@Addable

オートマッピング

[1, 2, 3, 4] + 4 # [5, 6, 7, 8]
[1, 2, 3] == 2 # [false, true, false]

親子関係

B := # < A {
member : Type
*static* : Int
}

クラスは型を宣言する行為

class A (pub a : Int) {
pub f := {}
}

“ a “ . p ()