2015-01-01から1年間の記事一覧

Haskell で仮想マシンを書く fetch

仮想マシンなので命令はメモリから読もう。レジスタを2つ増やして、プログラムカウンタと計算結果を保存するレジスタを持つようにしてみる。命令は停止命令とACCレジスタをインクリメントする二つだけ用意しよう。 data Reg = PC | FP | ACC deriving (Eq, …

Haskell で仮想マシンを書く

モナドの練習として仮想マシンを書く。レジスタとメモリを、キーをレジスタまたはアドレスとし値を保持できる Map で表すことにしよう。 type Regs r x = Map.Map r x type Memory p x = Map.Map p x data VM r p x = VM (Regs r x) (Memory p x) deriving (…

Template Haskell (TH) でデータ定義

列挙型とその文字表現を、データで定義できる TH を書いた。 -- モジュールA defDataConstsType "T_Digit" (map (\x -> "T_" ++ [intToDigit x]) [0..10]) defShowType "T_Digit" (map (\x -> ("T_" ++ [intToDigit x], "'" ++ [intToDigit x] ++ "'")) [0..…

PEG

PEG モドキを Haskell で。データ構造を定義した。Show のインスタンスにする部分は省略。 data PExp nt = Eps -- epsilon | AtomT String -- Terminal symbol | AtomNT nt -- Non-Terminal symbol | PExp nt :. PExp nt -- e1 e2 | PExp nt :/ PExp nt -- e…

Java コード生成へ向けて

lisp/scheme でS式からコード生成を行いたい。最終的なイメージは以下のような Java の S 式表現から Java コードを生成することだ。 gosh> (print (jise->java '((System.out.println "Hello, Java!") (declare x 0) (assign x 3) (when (= x 3) (System.ou…

sxml の簡易シリアライズ

SXML (http://ja.wikipedia.org/wiki/SXML) の名前空間部分を無視して文字列化する、簡単なシリアライザーを gauche で書いた。 以下使用例。生成された文字列と、その前段階のリストを同時に返している。 gosh> (simple-sxml->xml '(tag)) "<tag/>" ("<" "tag" ()</tag/>…