Shiika/Array<T>
code:llvm
@"::Array<K>" = external global %"Meta:Array<K>"*
@"::Array<V>" = external global %"Meta:Array<V>"*
@"::Array<W>" = external global %"Meta:Array<W>"*
いまの.llがこうなってるの明らかにおかしいからなんとかしたい
code:shiika
class A<T>
def wrap(item: T) -> Array<T>
ret = Array<T>.new
ret.push(item)
ret
end
end
というコードがあるとして
いまは「Array<T>という名前の定数を参照する」という意味論になっているが
理念としては、TがIntならArray<Int>、TがStringならArray<String>を参照する、ということであるはず
p Tとかも同様
そのような挙動を実装するには?
selfに型情報を持たせる予定なのでそこからクラスオブジェクトを取ることはできるはず
がしかし、Array<Int>とArray<String>は同じメソッドを持つ(違うメソッドを定義することができない)ので
llvm function的には型パラメータは無視できる
型パラメータが意味を持つのは型チェックの方(引数、返り値の型に影響)
ので
const_refじゃなくclass_literalにしたらよさそう(メモ)
ただそれだけだと Array<Int>.name とかがうまくいかないので、長期的には「selfからTを取ってきてArray<Int>をつくる」を実装する必要がある
クラスの型パラメータはselfから取れる
メソッドの型パラメータは?
ary.map<Int>{ ... }
call Array#map()