OCaml

多相なprintを求めて -その2-

30分プログラム、その202。多相なprintが欲しいので、Obj.tagで分岐してみる。 前回、Objモジュールを使えば、型に関する操作ができそうだということが分ったので、調べてみた。ここで、Obj.magicとかを適当に説明するつもりだったけど、#006 禁断の Obj - K…

多相なprintを求めて-その1-

30分プログラムその201。いい加減ネタを探すのが大変なので、ちょっと大きめな課題を一日30分づつ進める方針にチャレンジ。 で、デバッグに便利な多相なprintをOCamlで実装してみよう。 要するに、Haskellで言うとshow、型で言うと'a -> stringのような関数…

スレッドセーフな文字列出力

30分プログラム、その200。OCmalでスレッドセーフな文字列出力。 マルチスレッドでプログラミングしていたら出力文字列が混ざってしまったので、スレッドセーフな文字列出力を作ってみた。 Mutexを使っている。あと、デバッグ目的で使いたかったので、即座に…

camlp4で四則演算。

30分プログラム、その183。camlp4で計算機をつくってみる。いきなりcamlp4をバリバリつかうのは大変そうなので、まずはパーサ部分だけをつかって計算機を作ってみた。 これは、パーサとして使うのもありかもしれない。ただ、どうも字句解析器をつくるのがえ…

mapreduce

30分プログラム、その182。OCamlでmapreduce。 OCamlのチャネル(Event.channel)を覚えたので、さっそく使ってmapreduceを実装してみよう。正直、これであってるのかあまり自信がない。自分はmapreduceを次のように理解している。 mapreduce f g init xsとい…

Camlp4メモ

http://www.jmuk.org/~mukai/camlp4tut.htmlを読んだメモ。 プリプロセッサ camlp4は、構文木を変形することでOCamlの構文を拡張する。Lispのマクロと目的は同じ camlp4は字句解析器、構文解析器、抽象構文木が独立している。だから、構文拡張以外にも利用で…

S式計算機

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…

S式パーサ

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…

Haskellらしいfizzbuzz/OCamlらしいfizzbuzz

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 プログラミング基礎と実践理解 OCaml-Nagoya 著 A5版 ISBN978-4-8399-2311-2

matchとwhen

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とやれば、アセンブルされた文字列が出力される。 ほいで、既にア…

docaml

http://mzp.sakura.ne.jp/files/docaml.pdf The OCaml System - ImplementationのPDF版。 ちょいと、OCamlのVMに興味がわいたので読んでみることにする。でも、印刷しやすいPDF版がなかったので自分で作ってみた。 って、インク切れだよ。orz

godi on cygwin -完結編-

ldがエラーを吐いて、GODIをcygwinにインストールできないあなたに。 $PREFIXというディレクトリにインストールしてるとする。要するに、bootstrapで指定したやつね。 $ export OCAMLLIB=$PREFIX/lib/ocaml/std-libとしてやればいい。 あとは解説。 なぜイン…

GODI on Cygwin

GODIがCygwinにインストールできないか試行錯誤中。まだ、できていない。 ./bootstrap_stage2でこける find-libのビルドができていない $PREFIX/build/godi/godi-findlib/work/findlb-1.1.2pl1/tools/extract_argsのビルドが失敗している libcamlrun.aが見つ…

OcamlYaccのデバッグ

環境変数OCAMLRUNPARAMにpをセットしてやればいい。 http://ocaml.jp/archive/ocaml-manual-3.06-ja/manual024.html#ocamlrun-options

Optional arguments

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 新機能を追加するほどの元気はなかったので、微調整。 存在しないページへのリンクは編集用リンクに切り替え ページのタイトルを変更できるようにした 関数名の調節 &と"をエスケープするようにした

wikiname

http://mzp.sakura.ne.jp/owiki/wiki.cgi インライン要素のパーサを追加。こいつをいじくる事で、URL自動リンクとかができるようになる。 とりあえず、WikiNameに対してリンクを貼るようにしてみた。本当はページが存在するかを確認した上でリンクを貼る必要…

ocamlyacc

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で検索すると結構ひかかった。どうやらシステムコールの名前らしい。古の束縛かしら。

OCamlでScheme

SchocaというOcamlで書かれたScehmeインタプリタがあるので、使ってみる。 GODIを使えば簡単にインストールできる。 どうやら、ちゃんとしたドキュメントはなく、examples/にある例をよめ、ということらしい。 で、その例を読んだところ、 Schemeのデータ型…

書き込み可能っ

OCamlなwikiが書き込みできるようになりましたっ。 ・・・タグを殺してないので、めっさ危険なんでURLはヒミツの方向で。

OWiki

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を…

CGI勉強中

OCamlでCGIを作るためにいろいろ試行錯誤してます。とりあえず、現状をば。 WindowsでGODIがインストールできない。ldがcamlrunというライブラリを見つけれないのが原因っぽい。早めになんとかしよう。 OCamlNetの使い方を勉強中。Objectiveだ。 テンプレー…

ocaml-naogoyaは濃い

ocaml-nagoyaは集まってする勉強会より、そのあとの晩ご飯タイムのほうが面白いんだけど、id:peregrinationとfriend:donutはその前に帰っちゃうので、紹介をば。 Windowsユーザーが少数派。大半はMac or BSD。残りのWindowsユーザーもCygwinを使っている Dvo…

OCamlでCGI

まずは結論から。 #!/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…