<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"><channel><title>OCaml / Drkcore</title><link>http://blog.kzfmix.com/OCaml</link><description>Programming, Music, Snowboarding</description><language>ja</language><lastBuildDate>Sat, 26 Sep 2009 11:15:11 +0919</lastBuildDate><item><title>たらい回し関数</title><link>http://blog.kzfmix.com/entry/1253929156</link><description>&lt;p&gt;&lt;a href="http://blog.headius.com/2009/04/how-jruby-makes-ruby-fast.html"&gt;jrubyのたらい回し関数のエントリ&lt;/a&gt;みてたらClojureでもやってみたくなった。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Clojure 1.0.0-
user=&amp;gt; (defn tak [x y z] 
      (if (&amp;gt;= y x) 
      z 
      (tak (tak (- x 1) y z) (tak (- y 1) z x) (tak (- z 1) x y))))
#'user/tak
user=&amp;gt; (time (dotimes [_ 100] (tak 24 16 8)))
"Elapsed time: 27580.504 msecs"
nil
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ついでにOCamlでも&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;let rec tak x y z =
  if y &amp;gt;= x then z
  else tak (tak (x-1) y z) (tak (y-1) z x) (tak (z-1) x y)
;;

for a = 1 to 100 do
  ignore(tak 24 16 8)
done
;;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;まずはバイトコードで。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ocamlc tak.ml -o tak.exe
$ time ./tak.exe 

real    0m10.777s
user    0m10.692s
sys     0m0.033s
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ネイティブコードにコンパイルすると&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ocamlopt tak.ml -o tak_opt.exe
$time ./tak_opt.exe 

real    0m1.130s
user    0m1.119s
sys     0m0.006s
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;結構はやい。&lt;/p&gt;

&lt;p&gt;そういえば&lt;a href="http://blog.kzfmix.com/tag/Moosp"&gt;MooseでLisp&lt;/a&gt;はたらい回し関数はしるくらいまではやっとこうと思いつつ止まってしまっていたのに今気づいた。&lt;/p&gt;
</description><pubDate>Sat, 26 Sep 2009 11:15:11 +0919</pubDate><category>OCaml</category><category>Clojure</category></item><item><title>駱駝使いw</title><link>http://blog.kzfmix.com/entry/1253234327</link><description>&lt;p&gt;perlと言えば駱駝、OCamlと言えば駱駝。つまり両頭使いは必然の流れですな。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://merjis.com/developers/perl4caml"&gt;perl4caml&lt;/a&gt;を使うとocamlでperlのコードを取り込める。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#require "perl";;
open Perl;;
eval "use Net::Twitter";;
eval "Net::Twitter-&amp;gt;new({username =&amp;gt; 'ur', password =&amp;gt; 'pw'})-&amp;gt;update('from perl4caml')";;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://twitter.com/kzfm/status/4067038820"&gt;from perl4caml&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CPANの膨大な資産が使えるのは魅力。&lt;/p&gt;
</description><pubDate>Fri, 18 Sep 2009 09:39:43 +0919</pubDate><category>perl</category><category>OCaml</category></item><item><title>ocamlでtwitterのタイムラインを取得</title><link>http://blog.kzfmix.com/entry/1253012674</link><description>&lt;p&gt;&lt;a href="http://sourceforge.net/projects/ocurl/"&gt;ocurl&lt;/a&gt;入れてocamlコマンドからロードしようとすると&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# #load "curl.cma";;
Error: The external function `helper_curl_version' is not available
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;といってエラーがでる。libcurl-helper.aを一緒にしないといけないっぽいが。&lt;/p&gt;

&lt;p&gt;仕方ないのでocamlcでコンパイルすることにした。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Curl.global_init Curl.CURLINIT_GLOBALALL;
let connection = new Curl.handle in
connection#set_userpwd "user:password";
connection#set_url "http://twitter.com/statuses/friends_timeline.xml";
connection#perform
;;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;をmain.mlで保存して&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ ocamlc -I . -ccopt -L. curl.cma main.ml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;できたa.outを実行するとうまくうごく。&lt;/p&gt;

&lt;p&gt;あとはutf8の処理とxmlの処理。&lt;/p&gt;

&lt;p&gt;&lt;div class="awsxom"&gt;
&lt;a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774132640/ref=nosim/kaerutyuuihou-22"&gt;
&lt;img src="http://ecx.images-amazon.com/images/I/412bmsGN1dL._SL160_.jpg" align="left" hspace="5" border="0" alt="ProductName" class="image" /&gt;
&lt;strong&gt;プログラミング in OCaml ~関数型プログラミングの基礎からGUI構築まで~&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
五十嵐 淳 &lt;br /&gt;
技術評論社 / ￥ 2,919 ()&lt;br /&gt;
在庫あり。&lt;br /&gt;
&lt;br clear="all" /&gt;
&lt;/div&gt;&lt;/p&gt;
</description><pubDate>Tue, 15 Sep 2009 20:06:10 +0919</pubDate><category>OCaml</category></item><item><title>mac osxのswigでOCamlを使えるようにする</title><link>http://blog.kzfmix.com/entry/1252754491</link><description>&lt;p&gt;オプションで指定する。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo port install swig +ocaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;でも、なんかエラーが出てて、いまのとこうまいこと使えてない。&lt;/p&gt;
</description><pubDate>Sat, 12 Sep 2009 20:49:07 +0919</pubDate><category>OCaml</category><category>macbook</category></item><item><title>OCamlのべき乗</title><link>http://blog.kzfmix.com/entry/1252740365</link><description>&lt;p&gt;floatしかべき乗の演算子がないのは何故？&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# 2.0 ** 3.0;;
- : float = 8.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;int&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# 2 ** 3;;
Characters 0-1:
  2 ** 3;;
  ^
Error: This expression has type int but is here used with type float
&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Sat, 12 Sep 2009 16:26:05 +0919</pubDate><category>OCaml</category></item><item><title>arcsinのテーラー展開でπをもとめる(ocamlで)</title><link>http://blog.kzfmix.com/entry/1252674173</link><description>&lt;pre&gt;&lt;code&gt;let rec power m = function
    0 -&amp;gt; 1
  | n -&amp;gt; m * power m (n-1)
;;

let rec factorial = function
    0 -&amp;gt; 1
  | n -&amp;gt; n * factorial (n-1)
;;

let rec calc_pi = function
    0 -&amp;gt; 3.0
  | n -&amp;gt; (float_of_int (3 * factorial(2*n))) /.
 (float_of_int ((power 2 (4*n)) * (power (factorial n) 2) * (2*n+1))) +. calc_pi (n-1)
;;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;これだとcalc_pi 6ぐらいでneg_infinityになってしまう。あと型で結構つまづく。&lt;/p&gt;

&lt;p&gt;普通に求めるヤツ&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;let mc () =
let x = Random.float 1.0 in
let y = Random.float 1.0 in
if sqrt ((x ** 2.0) +. (y ** 2.0)) &amp;lt;= 1.0 then 1
else 0
;;

let rec count n res = match n with
  0 -&amp;gt; res
| _ -&amp;gt; count (n-1) (res + mc())
;;

let calc_pi n =
  let res = count n 0 in
  (float_of_int res)*.4.0 /. (float_of_int n)
;;
&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Sat, 12 Sep 2009 09:04:50 +0919</pubDate><category>OCaml</category></item><item><title>OCamlでbz2</title><link>http://blog.kzfmix.com/entry/1252582880</link><description>&lt;p&gt;&lt;a href="http://ja.doukaku.org/224/"&gt;どう書く？org : データの圧縮と展開 &lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#require "bz2";;

let compress str =  Bz2.compress str 0 (String.length str);;
let uncompress str =  Bz2.uncompress str 0 (String.length str);;

let _ = uncompress (compress "test");;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;参考&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://camlbz2.forge.ocamlcore.org/"&gt;CamlBZ2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="http://cristal.inria.fr/~xleroy/software.html#camlzip"&gt;camlzip&lt;/a&gt;ってのもあるんだが、ちょっと使いにくい感じがした(require出来ないし)&lt;/p&gt;
</description><pubDate>Thu, 10 Sep 2009 20:42:53 +0919</pubDate><category>OCaml</category></item><item><title>OCamlでfork</title><link>http://blog.kzfmix.com/entry/1252413186</link><description>&lt;p&gt;どう書くの&lt;a href="http://ja.doukaku.org/242/"&gt;外部の実行ファイルを呼び出し&lt;/a&gt;って問題を解く。&lt;/p&gt;

&lt;p&gt;ブロックする版は&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#load "unix.cma";;
Unix.system "/bin/sleep 3";;
print_string "waited\n";;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;でいいんでしょ。&lt;/p&gt;

&lt;p&gt;で、ブロックしない版をこんな感じで書いたら、&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;let pid = Unix.fork () in match pid with
     0 -&amp;gt; Unix.system "/bin/sleep 3"; print_string "waited\n"
   | _ -&amp;gt; print_string "not wait\n"
;;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;warningがでる。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Warning S: this expression should have type unit.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;よくわからなくて気持ち悪い。&lt;/p&gt;

&lt;h4&gt;追記090909&lt;/h4&gt;

&lt;p&gt;ignoreを使えばよいとはてブで教えてもらった。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# ignore;;
- : 'a -&amp;gt; unit = &amp;lt;fun&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;unitを返す&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;let pid = Unix.fork () in match pid with
     0 -&amp;gt; ignore(Unix.system "/bin/sleep 3"); print_string "waited\n"
   | _ -&amp;gt; print_string "not wait\n"
;;
&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Wed, 09 Sep 2009 20:24:31 +0919</pubDate><category>OCaml</category></item><item><title>OCamlのファイルアクセス</title><link>http://blog.kzfmix.com/entry/1252106768</link><description>&lt;p&gt;openfileとかopen_outとかopen_out_genとか色々あるので混乱する。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;let file = Sys.argv.(1) in 
let f = try open_out_gen [Open_wronly; Open_creat; Open_trunc; Open_text] 0o600 file
with Sys_error msg -&amp;gt; failwith ("Couldn't write to " ^ msg) in 
output_string f "OCaml\n";close_out f;;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://ja.doukaku.org/244/"&gt;どう書く？org:ACLの制御&lt;/a&gt;&lt;/p&gt;
</description><pubDate>Sat, 05 Sep 2009 08:26:28 +0919</pubDate><category>OCaml</category></item><item><title>ocamlcで吐いたバイトコード</title><link>http://blog.kzfmix.com/entry/1252067052</link><description>&lt;p&gt;&lt;a href="http://caml.inria.fr/pub/docs/oreilly-book/html/book-ora067.html"&gt;Standalone Executables&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;実行ファイルの一行目に&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/local/bin/ocamlrun
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;って書いてあるで、って書いてあったので確かめた。&lt;/p&gt;

&lt;p&gt;ほう。&lt;/p&gt;
</description><pubDate>Fri, 04 Sep 2009 21:25:34 +0919</pubDate><category>OCaml</category></item></channel></rss>