generated at
HaskellでCodeGenを作る
コード生成部分の処理をどう書くか


JavaScriptをアセンブリに変換する解説



問題になりがちなところ
変数のコンフリクトの解消
インデントの整形
Prettyprinterを使ってみるとか?
ElmのReportingではこれを使ってる
nest という関数がある



"{"でネスト深めて開業、"}"でネスト浅くして開業
; で開業する












アセンブリを吐くCコンパイラ
キレイだし参考になりそう
ちなみにv1もある


GADTを用いる
コード


概要
ASTからC言語のコードを生成する
中間言語を作らない代わりに汎用性の高いLang型クラスを作る
C言語用のインスタンスをつくる
今回の記事では解説されていないが、この型クラスを使えばC言語以外の言語用のインスタンスも作れる
ので、同じASTから様々なコードを生成できる抽象化になっている
関数だけでなく、if文、loopなども
いつ読み返したら役立ちそうか
コード生成をやるとき
やってることのメモ
型クラスLangについて
疑問
int
なんで真偽値は Exp l Bool のみなのに、整数は Int -> Exp l Int のように関数になっているんだ?
普通に Exp l Int だけじゃだめなのか
ifThenElse
EB -> EI1 -> EI2 -> EI3 の形になっているが、なんで一階層深い?
if B then E1 else E2 なのなら、 EB -> EI1 -> EI2 じゃだめなのか?
loop
loop -> from -> to -> (acc) -> f の形になっている
fromからtoまでaccumulatorにfを繰り返し適用する
c
for(i=0; i<10, i++) { printf("%d", i); }
language-c-quoteというライブあっ利
Template Haskell?を使ってる