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 ()