OCamlのフォーマッタで文字列化する方法 let spp pp_v () v = Format.fprintf Format.str_formatter "%a" pp_v v; Format.flush_str_formatter ()
OCamlの型が分からない場合に、推論結果が欲しくなった。 ググってもすぐ見つからない。ということでメモ。 ocaml -i a.ml > a.mli と書く。複数ファイルある場合は、 ocaml a.ml -i b.ml > b.mli
関数型言語といえばまず、Lispがありました。そして、SMLがありHaskellがあります。Cleanなんてのもありました。LispはCLOSというオブジェクト指向のCommon Lisp (CL) のオブジェクト指向プログラミング機能があります。CLOSはRubyに影響を及ぼしているよう…
去年は言語をずっと作ってました。 でもまぁ、結構迷走してたかも。・最初はLLVM向けのC言語でオブジェクト指向がある程度動くようにする。 ・型推論と型理論の研究成果を生かさなきゃと方針変更 ・MinCamlのシンタックスを変える方向性を探る。 ・多相型推…
英語が苦手だ。グローバルスタンダードになれない。 ローカリゼーションが苦手だ。日本は最高であり、アジア人は日本人のいうことを只聞けば良い。そう思っている節がある。 今のソフトウェアは輸入排他的になっている。 話し合いが苦手だ。嫌われる事を恐れ…
環境破壊が止まりません。このままでは不味い事は誰でも分かっている事です。 しかし止められません。なぜでしょう?様々な事が言われていますが、人口は増え続けると、それだけの人達が食べる食料と使うエネルギーが必要になることは明らかです。 人口が増…
OCamlではリストでスタックを表しパターンマッチで奇麗にスタックマシンを書く事が出来ます。 let rec eval (s,c) = match (s,c) with | `I a::`I b::s,`O "+"::c -> eval (`I(a+b)::s, c) | `I a::`I b::s,`O "-"::c -> eval (`I(a-b)::s, c) | `I a::`I b:…
https://bitbucket.org/h_sakurai/yallc/srcllcをmlで書いてみました。 LLVMには依存してなくて、パーサとコンパイラがあるだけです。 出来る事は、四則演算しかないんですけど、これを拡張していけば、 バッグエンドの仕組みが分かるはず。現状は、スタック…
SwiftのArrayがおかしいって話があったので、たぶん、Scalaなら美しいだろうと思って調べてみました。 package s object main extends App { val a = Array(1,2,3) var b = a a(1) = 33 b(0) = 55 b = b :+ 2 var b2 = b :+ 2 println(a.mkString(" . ")) pr…
結局、次に作成するコンパイラはCamlP4は使わずにocamlyaccとocamllexでMinCamlに近い形で作る事にしました。 そして、テストファーストで四則演算、それ以外の関係演算子や比較演算子、論理演算子等を加え、LLVMに出力し、参照を導入して、mutableな変数の…
とりあえず、三項演算子以外のCの式のほとんどをカバーする所まで作ってみました。 プリプロセッサとして、Lisp的なマクロを行う場合はこの方式は良さそうだけど、今はユーザー定義の演算子は必要ないのでこの方式は一度、ここで止める事にしました。 (* $ o…
演算子順位法を使って、C言語の2項演算子をパース出来るようにしました。 &と*はポインタ演算に使うので特殊に扱いますが、基本的に記号の連続は1つの演算子として字句解析するようにしました。 (* $ ocamlc -pp camlp4o calc.ml *) open Format type toke…
今回は、四則演算のパーサを優先順位法を使って書き換えたバージョンを書きました。 テストは前回と同じだけど、Hashtblを使っています。これがさらっとかけるようになれば、LLVMのカレイドスコープのパーサも簡単と言えるようになるでしょう。 (* $ ocamlc …
四則演算のパーサを作る際に、テストファーストにするとよいはずです。という事で、テストだけ先に書きます。 (* $ ocamlc -pp camlp4o calc.ml *) open Format type token = | Number of float | Op of char type e = | Num of float | Bin of e * string *…
EXTENDを使わないでCamlp4使って四則演算を作れるところまで何段階かに分けて書いてみました。今はocamllex/ulex + menhir がよいらしいんですけど ま、使ってみないと分からないし。 (* $ ocamlc -pp camlp4o test2.ml $ ./a.out *) open Format (* 字句解…
とりあえず、取り出すだけなら以下のコードで出来ました。 (* $ ocamlc -pp camlp4o test2.ml *) open Format type token = Number of float let print_token ppf = function | Number n -> fprintf ppf "Number(%f)@?" n let rec lex = parser (* Skip any …
OCamlでLLVMのライブラリを使うのにサンプルコードが欲しいので書き始めました。https://bitbucket.org/h_sakurai/llvm-ocaml-samples/wiki/Home
TAPLのScala版のソースを呼んでいた訳ですが、変数名や型名を自分に合わせて書き換えたかった。 大量にある、ソースコードはIDEのリファクタリング機能を持ってしても手に余るので以下のようなコードがあると便利です。実行する前にバックアップを着実に取り…
多相型推論をする言語を作りたいのですが、その前に部分的型付けを勉強しておきたい所です。TAPLのrcdsubbot*1から型付け部分だけ抜き出して名前をオレオレに変換してScalaで書いてみました。TopはScalaでいうとAny型で、どんな型でもTopの子になります。Bot…
前から本を書いてみたいなぁとは思っていたのですが、書ける気がしないなぁと思ってました。 大学のときの卒業論文はワードか一太郎で書いたような覚えがあります。 先輩達はlatexがどうのと言ってた気はするんだけど、まぁ、いいやと。 でも、texで書いてい…
Cっぽいλ計算にトポロジカルソートを利用した前方参照を付けてみました。 トップレベルだけは、前方参照できます。 main=mul(add(1)(2))(3) add=(a)=>(b)=>a+b mul=(a)=>(b)=>a*b なプログラムがちゃんと動きます。 以下ソースです。 package C2E7 import ut…
前方参照できる型推論をするには依存関係を調べて順番に並べる必要があります。 どう調べたら良いのかと調べてたらトポロジカルソートをするのが基本みたいでした。https://gist.github.com/ThiporKong/4399695tsort.scalaで検索したら凄く短いけど、分から…
Haskellの型システムが気になって何年かぶりにHaskellを使ってみました。 もう殆ど忘れていたのだけど、一から勉強するよりは楽に使えたのだと思います。 正規表現ライブラリを使って標準入力の引数を四則演算するだけの物を作ってみました。 import Text.Re…
いい加減な実装ですけど、関数を追加しました。ラムダ計算だと簡単に追加出来ていいです。 {val add = (a)=>(b)=>a+b; add(1)(2)} 1+2=3を計算出来ます。{(a)=>(b)=>a+b}(1)(2)だと名前無しで実行出来る。ひたすら手計算で環境をああしてこうしてって考えて…
パーサ追加して、簡単な評価器を付けてみましたよ。 これをどんどん拡張していけば、バックエンドはmincamlとかと同じ物を使ったり出来て楽しいのではないかと思います。 package C2E5 import util.parsing.combinator._ object parser extends RegexParsers…
C言語様な言語をML様な言語に変換するプログラムを作ってみました。 package C2E trait C case class CInt(a:Int) extends C case class CId(a:String) extends C case class CAdd(a:C,b:C) extends C case class CVal(a:String, b:C) extends C case class …
四則演算が出来るパーサに変数を追加して=演算子を使いたい場合に、右結合する演算子を作る必要性が出てきます。右再帰はしたいとかですね。LL文法では左再帰すると無限ループしてしまうので困るのですが、右再帰は特に問題ないはずです。しかし、現時点でグ…
これはまぁ、非常に難しい問題ですけど、いろいろな要素があります。タスクスイッチコストがかかる作業中に話しかけられるのが問題なのです。作業の難易度について1. プログラマの作業はひたすらコピペレベルな非常に簡単なレベルがあります。このレベルの作…
オンライン演習システムのおかげでようやく、型理論が分かってきました。 身に付いて来たといったほうがいいのかな。知識としてあるだけではなくて、実際に手を動かさないと覚えないんですね。 逆に言えば手を動せば覚えは速い。でもさすがに、大きすぎる計…
1. 単純なスタックマシンのJITするようなコンパイラを作ってた。SML#の勉強をする。 Scalaでコンパイラを結構本気で作る。 D言語に移植してみる(中途半端) SML#に移植する。2. LLVMに移植したバージョンを作る。ScalaとF#で書いたんだったかな?3. オブジェ…