OCaml
30分プログラム、その202。多相なprintが欲しいので、Obj.tagで分岐してみる。 前回、Objモジュールを使えば、型に関する操作ができそうだということが分ったので、調べてみた。ここで、Obj.magicとかを適当に説明するつもりだったけど、#006 禁断の Obj - K…
30分プログラムその201。いい加減ネタを探すのが大変なので、ちょっと大きめな課題を一日30分づつ進める方針にチャレンジ。 で、デバッグに便利な多相なprintをOCamlで実装してみよう。 要するに、Haskellで言うとshow、型で言うと'a -> stringのような関数…
30分プログラム、その200。OCmalでスレッドセーフな文字列出力。 マルチスレッドでプログラミングしていたら出力文字列が混ざってしまったので、スレッドセーフな文字列出力を作ってみた。 Mutexを使っている。あと、デバッグ目的で使いたかったので、即座に…
30分プログラム、その183。camlp4で計算機をつくってみる。いきなりcamlp4をバリバリつかうのは大変そうなので、まずはパーサ部分だけをつかって計算機を作ってみた。 これは、パーサとして使うのもありかもしれない。ただ、どうも字句解析器をつくるのがえ…
30分プログラム、その182。OCamlでmapreduce。 OCamlのチャネル(Event.channel)を覚えたので、さっそく使ってmapreduceを実装してみよう。正直、これであってるのかあまり自信がない。自分はmapreduceを次のように理解している。 mapreduce f g init xsとい…
http://www.jmuk.org/~mukai/camlp4tut.htmlを読んだメモ。 プリプロセッサ camlp4は、構文木を変形することでOCamlの構文を拡張する。Lispのマクロと目的は同じ camlp4は字句解析器、構文解析器、抽象構文木が独立している。だから、構文拡張以外にも利用で…
30分プログラム、その68。超簡単S式計算機id:mzp:20070623:sexpの続き。 #load "camlp4o.cma";; (* parsing *) open Genlex;; let ($) f g = f g;; type s_exp = Num of int | Symbol of string | List of s_exp list | Proc of (s_exp list -> s_exp);; let…
30分プログラム、その63。 OCamlのStreamでパーサを書いてみる。 # parse_string "1";; - : s_exp = Num 1 # parse_string "+";; - : s_exp = Op "+" # parse_string "(+ 1 3)";; - : s_exp = List [Op "+"; Num 1; Num 3]#load "camlp4o.cma";; open Genlex…
30分プログラム、その61。Haskellらしいfizzbuzz/OCamlらしいfizzbuzzを書いてみよう。 fizzbuzz :: [Int]->[String] fizzbuzz = map f where f n | n `mod` 15 == 0 = "fizzbuzz" | n `mod` 3 == 0 = "fizz" | n `mod` 5 == 0 = "buzz" | otherwise = show …
OCamlの本がでますよ。ちょっとだけ書いてます。 入門OCaml プログラミング基礎と実践理解 OCaml-Nagoya 著 A5版 ISBN978-4-8399-2311-2
garrigue先生の授業で聞いたやつ。 今まで知らなかったし、ざっと検索したかぎりでは資料が見つからなかった構文。 let rec subst env e = match e with | Var x when List.mem_assoc x env -> Num (List.assoc x env) | e -> map_expr (subst env) e;;かけ…
バイトコードの逆アセンブル。 javaの場合 $ javap -c HelloでHello.classの逆アセンブルができる。 javapは標準で付いてくるらしい。 うん、手軽だ。 ocamlの場合 $ ocamlc -dinstr hello.mlとやれば、アセンブルされた文字列が出力される。 ほいで、既にア…
http://mzp.sakura.ne.jp/files/docaml.pdf The OCaml System - ImplementationのPDF版。 ちょいと、OCamlのVMに興味がわいたので読んでみることにする。でも、印刷しやすいPDF版がなかったので自分で作ってみた。 って、インク切れだよ。orz
ldがエラーを吐いて、GODIをcygwinにインストールできないあなたに。 $PREFIXというディレクトリにインストールしてるとする。要するに、bootstrapで指定したやつね。 $ export OCAMLLIB=$PREFIX/lib/ocaml/std-libとしてやればいい。 あとは解説。 なぜイン…
GODIがCygwinにインストールできないか試行錯誤中。まだ、できていない。 ./bootstrap_stage2でこける find-libのビルドができていない $PREFIX/build/godi/godi-findlib/work/findlb-1.1.2pl1/tools/extract_argsのビルドが失敗している libcamlrun.aが見つ…
環境変数OCAMLRUNPARAMにpをセットしてやればいい。 http://ocaml.jp/archive/ocaml-manual-3.06-ja/manual024.html#ocamlrun-options
module type Foo = sig val f :int-> ?x:int->int->int end;;は大丈夫。 module type Foo = sig val f :int->?x:int->int->int end;;はダメ。 たぶん"->?"で一つのトークンだと認識されちゃうんだろうね。
http://mzp.sakura.ne.jp/owiki/wiki.cgi 新機能を追加するほどの元気はなかったので、微調整。 存在しないページへのリンクは編集用リンクに切り替え ページのタイトルを変更できるようにした 関数名の調節 &と"をエスケープするようにした
http://mzp.sakura.ne.jp/owiki/wiki.cgi インライン要素のパーサを追加。こいつをいじくる事で、URL自動リンクとかができるようになる。 とりあえず、WikiNameに対してリンクを貼るようにしてみた。本当はページが存在するかを確認した上でリンクを貼る必要…
http://mzp.sakura.ne.jp/owiki/wiki.cgi ocamllex/ocamlyaccを使ってWiki記法を追加中。タグを殺すことにしたので、id:syd_sydさんの書き込みの意味が分け分からなくなった。
let readdir path = let result = ref [] and dir = Unix.opendir path in let _ = try while (true) do result := (Unix.readdir dir)::(!result); done with End_of_file -> () in Unix.closedir dir; ! result;;なんだコレ。ほんとに関数型言語か?破壊的…
まずは、名前付き引数から。 (* 定義 *) let f ~x ~y ~z = x+y+z;; (* 呼び出し *) f ~x:1 ~z:3 ~y:2;;次はデフォルト引数。 (* 定義 *) let f ?(x=0) y = x+y;; (* 呼び出し *) f 2;; f ~x:1 2;;文法上、デフォルト引数は通常の引数より前でないと使えない。…
let ch = open_out_gen [Open_creat] 0O655 "hoge.txt"という形でファイルを作れる。 なんで、Open_creatやねん。createちゃうんかい。と思って、google:creatで検索すると結構ひかかった。どうやらシステムコールの名前らしい。古の束縛かしら。
SchocaというOcamlで書かれたScehmeインタプリタがあるので、使ってみる。 GODIを使えば簡単にインストールできる。 どうやら、ちゃんとしたドキュメントはなく、examples/にある例をよめ、ということらしい。 で、その例を読んだところ、 Schemeのデータ型…
OCamlなwikiが書き込みできるようになりましたっ。 ・・・タグを殺してないので、めっさ危険なんでURLはヒミツの方向で。
ocaml de wiki。やっはー。 Stubなデータベース(適当な文字列を返す)と、Stubなパーサ(preでくくって返す)、適当なテンプレートシステム(正規表現による文字列置換)を付くって、とりあえずWikiとしての体裁を整えた。うん、スタイルシートは偉大だと思う。 …
(* wiki.ml *) module Wiki = struct let read name = "hoge" end;;(* index.ml *) let _ = Wiki.read "FrontPage";という2つのファイルをコンパイルする方法をだれか教えてください。 あ、できた。http://www.ocaml-tutorial.org/compiling_with_gnu_makeを…
OCamlでCGIを作るためにいろいろ試行錯誤してます。とりあえず、現状をば。 WindowsでGODIがインストールできない。ldがcamlrunというライブラリを見つけれないのが原因っぽい。早めになんとかしよう。 OCamlNetの使い方を勉強中。Objectiveだ。 テンプレー…
ocaml-nagoyaは集まってする勉強会より、そのあとの晩ご飯タイムのほうが面白いんだけど、id:peregrinationとfriend:donutはその前に帰っちゃうので、紹介をば。 Windowsユーザーが少数派。大半はMac or BSD。残りのWindowsユーザーもCygwinを使っている Dvo…
まずは結論から。 #!/usr/local/bin/ocamlrun /usr/local/bin/ocaml let _ = print_string "Content-type: text/html\n\n"; print_string "Hello, OCaml!!\n"; exit 0;;ほいで、ここにたどり着くまでの軌跡をば。 #!/usr/local/bin/ocaml let _ = print_stri…