メモ2

クロージャー実装のための準備をしよう。関数へのポインタを保存して後から呼び出せなくっちゃ困る。分かってきたこと;LLVM では inttoptr, ptrtoint などで型変換が行える。関数の場合は function signature まで指定して変換してやる。おっと。ちょっと頭を整理しよう。

  • 今まで、プリミティブ(add1, sub1, +, -, null?, not, char?, cons など) は全て固定引数であった。
  • プリミティブをコンパイルするときは常にインライン展開のように直接 LLVM IR に変換していた。
  • code, labelcall によるユーザー定義関数は、LLVM の関数に変換した。ただし、関数名は一意の名前に変換した。引数の数は固定。
  • C の場合スタックに引数を積んでやる。LLVM の場合は calling convention を指定することでどのように引数が渡されるか制御できる。任意個数の引数も可能と分かった。http://www.llvm.org/docs/LangRef.html#int_varargs あたりを使う。
  • 自作のコンパイラはタグ付きポインタで何でも表す。
  • 関数型を素朴にデータとして積んだだけでは後から型変換する際に function signature が分からないので変換できなくなる。
  • 関数をコンパイルする時に引数の数を保存しておく?