OCaml
エラーリカバリで無限ループしてました。 こんな感じの文法があったとして。 start := x e x ::= w x x ::= x y x ::= z 最初にwを与えるとこうなります。(startはスタック) x ::= w * x | * w x x ::= * x y x ::= * z そこへ、eが来ると、エラーリカバリに…
予想通りにMakefile.ntがまるでメンテされて無くて笑っていいのか泣いていいのかでしたが、とりあえず.ntのつかない方からコピーしてあれこれしてたらhttp://d.hatena.ne.jp/shinichiro_h/20060918#1158547913は動きました。 #load "gcamllib.cma";; type a …
http://web.yl.is.s.u-tokyo.ac.jp/~furuse/gcaml/ 当然トップレベルと同じ出力が得られるGprintなるものもある。RTTIがあるということは、効率さえ気にしなければ型情報をMapに突っ込んでHaskellの型クラスモドキもできるわけですから、もうなんでもありで…
http://panathenaia.halfmoon.jp/alang/castling.html とりあえず当初の目的としては使える程度にはなったと思う……。 実はfirst-set作るところがバグってたりしたので、もっとテストケースが必要なのでしょうけれども。 コード自体もいくらOCamlと言ってもち…
http://code.google.com/p/deriving/ deriving (Show)サイコー。 他にも色々用意されてます。展開後のソースに対して警告出されるのが若干気になりますが、まあいいか。 あとは、専用のcompareが用意されている型についてはそれ使ってくれてそれ以外はPervas…
前回、 START ::= A * B D | A * C Dの状態でDが来たらBとCのどちらを補うかなんてのは迷いますが、どの道エラーリカバリですので適当にどっちか選ばれるようにしとけば問題ないと思います。recovery/recovery conflictなんてのは聞いた事が無いですし。 と…
かろうじて動くようになりました。http://panathenaia.halfmoon.jp/alang/castling.7zAST自動生成型のパーサジェネレータです。 奇跡的にLALR(1)のパーサを吐きます。 LR(0)項の集合そして状態遷移テーブルを作る超肝心の部分はcaperの丸写しです。従ってラ…
例えばこういう処理があるとします。 List.iter (fun i -> print i) a aには番兵xが含まれておりそこに来たら中断したいとします。 exception Break;; try List.iter (fun i -> if i = x then raise Break else print i) a with | Break -> () これは正気の…
http://ocaml.eclipse.ortsa.com:8480/ocaide/ すばらしそう。まあどうせデバッガはWindowsでは(Cygwin以外)動かないのでしょうけど。 最近は何でもEclipseですね。
あんだけ進めといてアレなのですが、方針転換します。パーサジェネレータ作ります。 OCamlのコンパイラが吐くエラーメッセージは正気とは思えないため、最終的に使う言語自身で書いたほうがパーサジェネレータ用の間に合わせの構文よりも嬉しいというパーサ…
http://aurochs.fr/cgi/demo.cgi新鋭のパーサジェネレータってどれもこれもすごく良いと思うのですけれど、どれもこれもエラーリカバリが貧弱なのはなんででしょうか。 構文木を勝手に作ってくれて、何もしなくても充分なエラーリカバリしてくれて一気にエラ…
こないだsheracyさんにパーサの演算子は右結合であるべきか左結合であるべきかと訊ねる機会を持てました。結論としては、>>がHaskellで左結合なのはdo構文のためとかそんなでparsecのが右結合なのも含め深い意味は無いらしくて、結局は使いやすい方を選ぶし…
デバッグ方法が無いな……はっ、F#!?
そういやGMP使ってたんだった→camlidldllのビルドにgccが必要→cc1が-m686を理解してくれない→手動ビルド→mlgmpidlのビルドにgmp.hが必要→gmp.hはGMPのRPMでは入らない→ソースからビルド→configure中にcppがsanity checkとやらでこける……。 ああ、今思うと、M…
RPMは楽でいいです。 ネットワークの設定がよくわかって無いため、Windowsでダウンロード……まあいいか。ocamldebug以外に用は無い。
ocamldebugを使いたいのでcoLinux入れました。入れたはいいのですが、トチ狂ってgentooを選択してしまったために、OCamlのインストール方法がわからん以前にネットワーク設定がさっぱりわからんという。 cofsでWindowsのドライブは見えるし、gccも入ってるよ…
こないだ、rec付けた時に仕方がないから()を……ってやってましたが、lazyでいいことが判明。lazyのほうが2回目以降の評価がいらないので確実にいいですね。 # let rec a = 1 and b = a;; Characters 22-23: let rec a = 1 and b = a;; ^ This kind of express…
モナドを使いやすくするdo構文はHaskellの専売特許です。a >>= (\b -> c >>= (\d >> return e))がdo b >=演算子を連ねた場合、本当は匿名関数をネストしまくってるところを、平坦に書けることですね。 では、匿名関数に括弧が要らなかったら……do構文いらない…
あれからだいぶ直してしまったので1から説明します。YT版Parser Combinator for OCaml……どう見てもHaskellやCleanのそれの劣化版ですが。 ええと、まず、今更言うまでもないですがパーサコンビネータというのはパースする関数とパースする関数をくっつける関…
最近ようやく、(* *)の打ち方がわかってきました。 (*は中指→人差し指、*)は人差し指→中指か薬指(気分次第)で打ちます。 このとき、位置はあくまで*基準で覚えておくと間違えにくいようです。 ……Pascalが{ }を使うようになったのは正解と思いますというか、…
普通に再帰下降で書いていたはずが、定型句が面倒になって、関数を作る関数に変えていったらこんなふうになってしまいました。 (* 2.3: identifier ::= identifier_start {identifier_start | identifier_extend} *) let rec identifier () = p_do ( identif…
参考(元ネタ)→http://d.hatena.ne.jp/soutaro/20060506/1146925290 トップレベルで式を評価してもと出て何もわからないのはとても悲しいのですが、そんなときも#install_printerしておけばなんか出せます。 open Format;; let print_utf8string x = print_st…
OCamlが遅くなる一番の原因はGCらしいです。某.NETや某JavaみたいにGCが他のアプリケーション用のメモリを食い潰すような実装にはなっていない良心的なGCらしいことは評価していいと思いますが具体的にどうなのかはさっぱり知りません。 ↑のコードでは、いち…
camlp4上の改訂版構文とやらを使ってみた。
Haskellのwhere欲しい。切実。 再帰でループはいいんですが、初期条件を与えるところがループ本体より下になってしまうのがいただけないです。 これはもうcamlp4に手を染めろってことでしょうか?
# type t = { x : t };; # let rec z = { x = z };; これを対話環境上で実行すると面白いことに。
# let f ~z = z;; val f : z:'a -> 'a = <fun> # f "1" 2 ~z:(fun x y -> (int_of_string x) + y);; - : int = 3 ……スタック型言語?</fun>
あれー、おかしいなー。GNUツールとは別れられたはずなのに。
OCamlの自慢らしいタイプセーフprintf。 型がついているということはcamlp4では無くてOCamlの構文の上に乗っているということですよね……。 # Printf.printf "%d";; - : int -> unit = <fun> # Printf.printf "%d %d";; - : int -> int -> unit = <fun> # Printf.printf</fun></fun>…
F#の|>は便利そうだなー。F#は普通にlet mutable等と書けて良さげ。本家もこれぐらい割り切って欲しい。 あとHaskellの$が欲しい。