🔥
コードを生成しないcollection今度こそできました。
うーん、まあ、特に必要ない機能です。組み込みとかのマイコンでは一応使えるかもしれません。
mapでは旨味がないです。ハッシュキーの生成に静的な型が必要なため。
listはかなりコードの生成を抑えられます。マイコンでは重要だ思います。
mapも一応各オブジェクトにget_hash_keyの関数ポインタを渡すようにすれば、mapも
コードの生成量が抑えられますが、その分全体的に遅くなるはずです。
version 14.0.0で使えます。一応サンプル
#include <comelang.h>
struct sData
{
int a;
int b;
string c;
};
struct sData2
{
string a;
};
int main(int argc, char** argv)
{
list<sData~>*% li = new list<sData~>();
li.add(new sData~ { a:1, b:2, c:s"WIN" });
list<sData2~>*% li2 = new list<sData2~>();
li2.add(new sData2~ { a:s"WIN2" });
puts(li[0].c);
puts(li2[0].a);
return 0;
}
このコードではlist<sData~>とlist<sData2~>のメソッドは同一コードが生成されます。
内部的にはvoid*として生成しています。その代わり要素の生成の時にnew sData~などとして
clonerとfinalizerを動的にオブジェクトに持たせてます。
new sDataとするとメモリリークが起こると思います。
一応セルフホストでも使っていて、2000行程度、生成コードが減ってました。
まあ、また気が向けばmapの方もコードを生成しないようにして、生成コードの量を減らすかもしれません。
ただ、全体的にシステムの速度は遅くなると思います。
Rustよりかなり簡単にコードを生成しないようにできるので、ちょっと自慢の機能です。
まあ、個人的には頑張りました。マイコンでcomelangが使い物になるようにしたいため。
マイコンはプログラムのサイズがデカくなりすぎるとダメですしね。
といってもマイコンでは僕もC言語使ってりゃいいと思いますけどね。ぶっちゃけると。
comelangを動かすというロマンでやってます。
Discussion