定期ミートアップ 第17回
最近の作業
前回と同じプルリクをまだいじっている…(反省)
もっと小さな単位できりをつけていきたい(今年の抱負)
Arrayのブートストラップ問題
https://gyazo.com/96d3d90eb25c1fda0d4cf6392828db6c
前提知識
ShiikaではクラスFooを一つ定義すると、定数Fooと、その値である「クラスオブジェクト」(#<class Foo>)が作られる
ArrayクラスとArray<Int>クラスは別
なのでArrayは#<class Array>、Array<Int>は#<class Array<Int>>になるようにしたい
どうするか
クラスオブジェクトにインスタンス変数@type_argsを追加
クラスオブジェクトの配列とする
どうなったか
配列を作るのに配列が必要になった
どうしたか
@type_argsをShiikaの配列ではなくした
具体的にはRustのVecにした
code:rust
// lib/skc_rustlib/src/builtin/class.rs
pub extern "C" fn class__specialize(receiver: SkClass, tyargs_: SkAry<ShiikaClass>) -> SkClass {
let tyargs = tyargs_.iter().map(|ptr| SkClass::new(ptr)).collect();
class_specialize(receiver, tyargs)
}
problem2
これを呼ぶのに配列が必要
solution2
1引数のバージョンも用意した
code:rust
pub extern "C" fn class__specialize1(receiver: SkClass, tyarg: SkClass) -> SkClass {
class_specialize(receiver, vec!tyarg) }
結果
test/sk/array.sk以外は通るようになった(調査中)