OCaml

Castling修正

エラーリカバリで無限ループしてました。 こんな感じの文法があったとして。 start := x e x ::= w x x ::= x y x ::= z 最初にwを与えるとこうなります。(startはスタック) x ::= w * x | * w x x ::= * x y x ::= * z そこへ、eが来ると、エラーリカバリに…

G'Camlですよ

予想通りにMakefile.ntがまるでメンテされて無くて笑っていいのか泣いていいのかでしたが、とりあえず.ntのつかない方からコピーしてあれこれしてたらhttp://d.hatena.ne.jp/shinichiro_h/20060918#1158547913は動きました。 #load "gcamllib.cma";; type a …

G'CamlにはRTTIがある!

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と言ってもち…

deriving

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の丸写しです。従ってラ…

breakが欲しい

例えばこういう処理があるとします。 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 -> () これは正気の…

OcaIDE

http://ocaml.eclipse.ortsa.com:8480/ocaide/ すばらしそう。まあどうせデバッガはWindowsでは(Cygwin以外)動かないのでしょうけど。 最近は何でもEclipseですね。

頭の悪いパーサジェネレータ

あんだけ進めといてアレなのですが、方針転換します。パーサジェネレータ作ります。 OCamlのコンパイラが吐くエラーメッセージは正気とは思えないため、最終的に使う言語自身で書いたほうがパーサジェネレータ用の間に合わせの構文よりも嬉しいというパーサ…

すごいパーサジェネレータ

http://aurochs.fr/cgi/demo.cgi新鋭のパーサジェネレータってどれもこれもすごく良いと思うのですけれど、どれもこれもエラーリカバリが貧弱なのはなんででしょうか。 構文木を勝手に作ってくれて、何もしなくても充分なエラーリカバリしてくれて一気にエラ…

みたび頭の悪いパーサコンビネータ

こないだsheracyさんにパーサの演算子は右結合であるべきか左結合であるべきかと訊ねる機会を持てました。結論としては、>>がHaskellで左結合なのはdo構文のためとかそんなでparsecのが右結合なのも含め深い意味は無いらしくて、結局は使いやすい方を選ぶし…

ocamldebug役に立たねえ

デバッグ方法が無いな……はっ、F#!?

Linuxは厳しいなあ

そういやGMP使ってたんだった→camlidldllのビルドにgccが必要→cc1が-m686を理解してくれない→手動ビルド→mlgmpidlのビルドにgmp.hが必要→gmp.hはGMPのRPMでは入らない→ソースからビルド→configure中にcppがsanity checkとやらでこける……。 ああ、今思うと、M…

coLinuxとfedora

RPMは楽でいいです。 ネットワークの設定がよくわかって無いため、Windowsでダウンロード……まあいいか。ocamldebug以外に用は無い。

coLinuxとgentoo

ocamldebugを使いたいのでcoLinux入れました。入れたはいいのですが、トチ狂ってgentooを選択してしまったために、OCamlのインストール方法がわからん以前にネットワーク設定がさっぱりわからんという。 cofsでWindowsのドライブは見えるし、gccも入ってるよ…

頭の悪いrec

こないだ、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…

頭の悪いFormat

参考(元ネタ)→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上の改訂版構文とやらを使ってみた。

隣の芝パート2

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>

頭の悪いmakefile

あれー、おかしいなー。GNUツールとは別れられたはずなのに。

頭の悪いformat

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の$が欲しい。