タグ

ブックマーク / camlspotter.hatenablog.com (22)

  • OCaml で LLVM -- 事始め - camlspotter’s blog

    この記事は LLVM-2.8 とその OCaml binding を使った LLVM プログラミングの始め方について、良く判らないという声を聞いたので、理屈はともかく、どうやって始めるかを主眼に書いた物です。OCaml や Makefile を全く書いた事が無いし知りたくも無い、でも LLVM を使いたいという方にはちょっと無理な内容になっています clang とか LLVM とかこの頃よく聞きますよね。Apple が製品に結構使っているという話ですし、気になっている人もいるでしょう。私も LLVM、気になりました。要するに、プログラム内で Cみたいな言語(語弊がありますが)の構文ツリーを動的に生成して、それを、はいお願いと LLVM のエンジンに投げるとアーラ不思議、各アーキテクチャ用にいい感じで JIT コンパイルしてくれてスイスイ動く、という魔法のような話です。 マシン語は Z80

    OCaml で LLVM -- 事始め - camlspotter’s blog
  • 大事なことは全部MLが教えてくれた 〜 Apple の Swift の mutability 周りの件を理解する - Oh, you `re no (fun _ → more)

    開発者アカウントに金が出せない貧乏人の方々が、次の AppleSwift のコードの挙動がわからない、というので盛り上がっております: let a = [1,2] // a = [1,2] var b = a; // b = [1,2] b[1] = 3; // a = [1,3] b = [1,3] b.append(5); // a = [1,3] b = [1,3,5] b[1] = 4; // a = [1,3] b = [1,4,5]もちろんわたしも貧乏ですからわかりやすい炎上案件を待っておるわけです。これはわかりやすいわからないが来たね。 だいたい b[1] = 3 とやると a[1] も変化する、これがわからないという人 b[1] = 4 とやると a[1] が変化しない、これがわからないという人 二種類いるようです。私はまず、 b[1] に代入できることがわかりません

    大事なことは全部MLが教えてくれた 〜 Apple の Swift の mutability 周りの件を理解する - Oh, you `re no (fun _ → more)
  • 静的型と OO というものははじめから… - camlspotter’s blog

    OO の方面から、「静的型とか別に役に立つとは思えない、静的型の人は頭おかしい」 とか関数型の方面から、「静的型が役に立たないなんてはずない OO の人は頭おかしい」 とか良く聞こえてくるんですが、ダックタイピング心理学 とかいう真に頭おかしい意見を無視できるとすると(無視できない量あるんですが)、まあ私にはどっちもわからんでもない、という話です。 型をゴミ箱に捨てておいてから、後でゴミ箱を漁るなら、型なんかいらない オブジェクトの静的型システムを大雑把にいうとまず upcast と downcast があります。 upcast はオブジェクトの静的型をそれが属するクラスからそのスーパークラスにを変えちまうこと、downcast はその逆、オブジェクトの静的型をそれが属するクラスから子クラスに変えちまうことです。サブクラスの物はスーパークラスとしても通用するはずですから upcast は失

    静的型と OO というものははじめから… - camlspotter’s blog
  • CamlP4 が何やっているか知りたいときどうするか - camlspotter’s blog

    一番よいのは CamlP4 が何を出力しているか見ることです。 例として OCamltter の Twitter API の JSON 表現と OCaml の型との間を取り持つ api11.ml がどうなっているか見てみましょう。 type 'a t = { previous_cursor : Json.t; next_cursor : Json.t; next_cursor_str : string; previous_cursor_str : string; contents : 'a mc_embeded; } with conv(json, ocaml) この型宣言の with conv(json, ocaml) の部分は CamlP4 の拡張の部分で、型定義からなにかしらコードを生成しています。 $ rm lib/twitter/api11.cmo $ omake --verbo

    CamlP4 が何やっているか知りたいときどうするか - camlspotter’s blog
  • 1モジュール1データ型主義 - camlspotter’s blog

    OCaml の「1モジュール1データ型スタイル」。このプログラミングスタイルは21世紀に入ってからモジュールを多用する OCaml コミュニティで流行りだしたもので私も採用しています。源流は SML 方面にあると聞きましたが…私自信は確認していません。要出典です。 「1モジュール1データ型スタイル」の意味するところは簡単です: データ型一つ一つにモジュールを一つ一つ作る。 モジュール名は型の意味する名前をつける。人なら Person。 モジュール内で定義するデータ型は常に t という抽象的な名前にする。 t を主対象とする操作はモジュール内で定義する。 ただし、全ての OCaml プログラムはこのように書かれるべし、というものでもありません。 例えば、 OCaml のコンパイラのソースコードはこのスタイルでは全く書かれていません。 「1モジュール1データ型スタイル」の利点は: モジュール名

    1モジュール1データ型主義 - camlspotter’s blog
  • OCaml 開発環境について ~ コンパイラに付属しない非公式ツールたち - camlspotter’s blog

    2012年12月での関数型言語 OCaml コンパイラ一式には入っていない 内部もしくは外部開発されたのツール群の紹介を行う。 例によって多岐に渡るので、一つ一つの詳しい説明は行わない。 各ツールの細かい情報はそれぞれのドキュメントを参照して欲しい。 リンクは貼るの面倒だからググって。 もし知らないツール名があったらちょっと読んでみて欲しい。 もしかしたらあなたの問題を解決するツールがあるかもしれないから。 ライブラリとツールの中間のようなコード生成系も取り上げた。 あくまでも基的に私が触ったことのある物しか紹介しないから、 そっけなかったりするのはあまり触ってないということ。 なんでこれはなんで取り上げてないの?と思ったら、それは使ったことないから。ごめんね。 不満があったら自分で紹介記事書いてください夜露死苦! ★は重要度。五点満点。 コンパイラ同梱のツールの紹介はもうした。 htt

    OCaml 開発環境について ~ コンパイラに付属しない非公式ツールたち - camlspotter’s blog
  • Meta_conv による OCamlデータ型 と 樹状データ の相互変換自動生成 - camlspotter’s blog

    Web にアクセスするプログラムを書いていると良く JSON というデータを扱う ことがあります。JSON とは世間で何と言われているかわかりませんが OCaml では: type t = | String of string | Number of float | Object of obj | Array of t list | Bool of bool | Null and obj = (string * t) list 簡単ですね。まあ S式に毛の生えたようなものです。 型の無い世界の人はこの簡単な型でもって、何でもかんでも表現しているみたい。 例えば、このデータは必ず整数リストだという仮定があっても JSON では当に データが整数リストであるか、どうか、確かめなきゃいけない。大変ですねー。 じゃあ OCaml だと楽かというと、やっぱり大変です。 JSON のデータをパースし

    Meta_conv による OCamlデータ型 と 樹状データ の相互変換自動生成 - camlspotter’s blog
  • コードレビューについて - camlspotter’s blog

    このところ立て続けにコードレビューについて話をする機会があったので 私が経験した最高のレビュー体制を簡単にまとめておこうと思います。 利点 何故必要か 何が嬉しいのか コスト うまく回すためには何が必要か 細かい運営方法 はっきり言って当たり前の事しか書きません。 私も当時は当たり前のことだと思っていましたから、特に気にもしていなかったのです。 ただ見聞するところによると、これをちゃんとやっているところはとても少ないようです。 ウォールストリート系のファンドでもろくにレビューしてないとかどういうことなんでしょう。 だから時々会社が吹っ飛ぶんですね… 結局は、ああだ、こうだ各論を言っても、ちゃんとやれるのか、それ一点に尽きてしまう話なのですが… 利点 レビューを何のためにするか、それはまず第一に自分達の書いているコードに潜在するバグによる損失をできるだけ少なくすることでしょう。 型システムや

    コードレビューについて - camlspotter’s blog
  • ML系言語の型エラー報告を改良する - camlspotter’s blog

    さて、お約束していた OCaml の型エラーメッセージ改良のための改造、ある程度形になりましたので、公開します。 hg clone -b typeloc https://bitbucket.org/camlspotter/mutated_ocaml ビルドは configure の後、 make core coreboot world です。インストールなさる場合は既存の OCaml システムを潰さないように注意してください。インストールなしにトップレベルを試したい場合は ./ocaml -I stdlib 。といってもまだコンセプトが理解できる程度にしか動作せずまだまだ不完全です。バグもあるかと思います。 さてここから簡単にアイデアを説明します。MLの型推論についてある程度の知識が必要です。 HM 型システムではプログラムの各所を見ながらそれぞれが要求する型の情報を制約として集め、解の存

    ML系言語の型エラー報告を改良する - camlspotter’s blog
  • ウェブブラウザで関数型プログラミング! js_of_ocaml - camlspotter’s blog

    js_of_ocaml が熱い。 GoogleDart とか、そんな場合じゃない!! OCaml で書かれたプログラムがなぜか JavaScript に変換され、それがブラウザで動く。 JS で型がついていないオブジェクトでも何となく型をつけて OCamlで型安全に呼び出せる! 既存の JS ライブラリ資産が、ほとんど手間をかけずに、そのまま関数型言語パラダイムで使える! え?よくわからない? http://ocsigen.org/js_of_ocaml/manual/ の demo を試してご覧なさい。これが全部 OCaml で書かれている…! そんなわけで、 js_of_ocaml 体験記。だいたい実際に行っていった Hack を(行き止まりになった失敗枝は刈り去って)なぞっている。あ、ちなみに当方 JavaScript に関してはほとんど知識が無い。JS に関しては用語とか間違

    ウェブブラウザで関数型プログラミング! js_of_ocaml - camlspotter’s blog
  • OCaml-indent: OCaml で書いた OCaml ソースコードインデンタ - camlspotter’s blog

    OCaml のソースコードのインデント整形には Emacs なら ocaml-mode, tuareg-mode, Vim なら ocaml.vim(?) や omlet.vim があります。便利です。 でもどうも細かい部分が自分のスタイルと違ったり、特殊な改行をするとボロボロッとおかしなインデントをしてきたりします。あーなんかヤダナアと思って、(私の場合は tuareg の emacs lisp を)直そうと思うのですが、どうも面倒です。Elisp は慣れて無いのでコードを解析するのは辛い。 そこで、じゃあインデント解析部は OCaml で書いて、解析とエディタの部分だけエディタ固有の言語で書くようにすれば、Elisp なり、 Vim script なり書く量は極小になるんじゃないかなと思って OCaml-indent を作りました。 さらにインデント解析もできるだけ手間を掛けたくないの

    OCaml-indent: OCaml で書いた OCaml ソースコードインデンタ - camlspotter’s blog
  • Monad にしちゃう functor を通して今時の OCaml モジュールプログラミングを俯瞰 - camlspotter’s blog

    これは私用の覚え書きを適当に整形したもの(というか Sphinx で hatena 記法にしただけだけど)。だから他の人が読んで判るように全く書いていない。OCaml や ML のモジュールシステム、 value polymorphism、さらには relaxed value polymorphism、そして日語を知っている人に、ならば何か役に立つかもしれない。多分地球上で数十人もいない。まあいいや。これ見てウヘェ、と思うなら例えば F# みたいな ML モジュールシステムを放棄して class 階層を採用した言語とか、 Haskell みたいな type class でモジュールを実現したのとかを使うか、それとももっと超カッコいいナントナクヒューリスティックで便利キワマルな型推論補助のついたモジュールシステムを考えて OCaml に足して公開すればいい。正直私もここまで来ると ML モ

    Monad にしちゃう functor を通して今時の OCaml モジュールプログラミングを俯瞰 - camlspotter’s blog
    okagawa
    okagawa 2011/07/18
    3.12で導入された、signatureのdestructive substitutionの使用例。モジュールの合成ができる。
  • OCaml の let と let rec はなぜ別扱いになっているのか、決定版、もしくは OCaml 暦十何年だったか忘れたけど仕事で Haskell を一年使ってみた - camlspotter’s blog

    はじめに断っておくが、全部Pros/Consのあるデザインチョイスなので、こうじゃなきゃいけないってことではない。ただ、 OCaml はこの選択をした、そいう事だ。 前回の「経験15年の OCaml ユーザーが Haskell を仕事で半年使ってみた」 http://d.hatena.ne.jp/camlspotter/20101212/1292165692 のような易しい文章ではないのでわからない人はとことん判らないだろう。まあ勘弁して欲しい。 あと、面倒だろうが、読む人は全部常体を敬体にして最後に「と思います」をつけて読んでくれ。ください、と思います。 Shadowing は便利であると思っている OCaml の let は非再帰なので以前定義された名前に別の値の束縛をオーバーライドできる。OCaml の人はこれが便利だと思っており皆普通に使っている。詳しくは http://d.hat

    OCaml の let と let rec はなぜ別扱いになっているのか、決定版、もしくは OCaml 暦十何年だったか忘れたけど仕事で Haskell を一年使ってみた - camlspotter’s blog
  • OCaml の type alias (type synonym) と non-parametric polymorphism - camlspotter’s blog

    OCaml では普通のデータ型の定義 (type t = Foo | Bar や type t = { foo : int; bar : float }) とデータ型の別名宣言 (type alias もしくは type synonym: type int2 = int * int) の区別が希薄になっています。 もちろん内部では違いがごっちゃになっているというわけではなく、バグがあるというわけではありません。ただ、問題は、type alias が新しいデータ型を作ってしまうこと。例えば上述の int2 は、int * int という型と暗黙のうちに変換可能な新たなデータ型として定義されます。(より格好良く言うと、型 int2 と 型 int * int は 単一化可能(unifiable)。) *1 これと、ML のモジュールシステムの隠蔽を組み合わせると、型の意味がモジュールによって変

    OCaml の type alias (type synonym) と non-parametric polymorphism - camlspotter’s blog
  • 経験15年のOCaml ユーザーが Haskell を仕事で半年使ってみた - camlspotter’s blog

    今の会社に移って半年経ちました。めでたく試用期間終了です。といっても別に試用期間中に密かに首を切られるような事をしたとか、逆に試用期間が終わったからと言ってこれで定年までのうのうと働ける、という訳ではありません。未来は全く判りません。まあとにかく、一つ区切りがやってきました。 金融を知らないQuantsの仕事 私の職業の肩書きには Quantitatitatitatitative という単語がくっついて超カッコよさそう。普通は Quant というと、金融工学や統計数理に詳しい夜もブイブイいわしている超イケメン20代を想像しますが、私は金融とか全然知らないアラフォーお父さんです。それでも Quant です。お願いですから、私に何を買ったらいいかとか、聞かないでください。金融商品とか買った事ないし。というか、逆に教えて欲しいです。 私のチームは、当の Quant さん達が開発した、金融派生商

    経験15年のOCaml ユーザーが Haskell を仕事で半年使ってみた - camlspotter’s blog
  • キャミバ様が id:ymotongpoo を木人形にされるようです - camlspotter’s blog

    事の次第 @camlspotter「めんどくせ、あいつに押し付けよ… @camloeba「おれには強く型付けされたコードが必要だ! あらゆる実験にたえうる木人形がな!ぶつぶつ‥ @camlspotter: 「キャミバ様、実はこんなものが… @camloeba「ほう… … ||||||:::::::;:::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::::::|     | |::::::;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::::::::::::::||||||| |||||::::::::::/   ●   \:::|    |:::/   ●   \::::::::::||||||| |||::::::::;;;;;;;──────;;;;;;;;|    |;;;;;;──────;;;;;;;;;;:::::|||||| |;;;;;;;

    キャミバ様が id:ymotongpoo を木人形にされるようです - camlspotter’s blog
  • 単相比較による高速化テクニック、そして、そのあまり知られていない落とし穴 - camlspotter’s blog

    今日は一転、真面目な話です ある程度 OCaml プログラミング経験がある皆様は、 int, string 等の基型の比較には多相比較ではなく、単相比較を使うべし。最適化された比較関数が使われ、早くなる という教をご存知かと思います。正しいです。でも、そこに実は落とし穴が: 実は、型だけ単相にしてもダメで、引数を全適用した形で使用しないと、最適化されない!! (OCaml 3.11.2 現在。将来は知りませんよ!!) もしこれをご存知でしたら、もう読んでいただく必要はありません。 第一のポイントは結構知られているようなのですが、実は第二のポイントはあまり知られていない様なのです。ざっと私が普段使っているOCaml のオープンソースライブラリを検索してみましたが、最適化された比較関数を使おうとしているが、第二のポイントを知らなかったため、実はされていなかった、というコードを結構見つけてしま

    単相比較による高速化テクニック、そして、そのあまり知られていない落とし穴 - camlspotter’s blog
  • 超簡単にオモチャ LWT を実装してみた - camlspotter’s blog

    OCaml は現時点でマルチコア対応じゃないので、マルチスレッドにしてもマルチコアの恩恵を享受することができません。ですので、OCaml で thread を使う旨みというのは、関数を並行に走らせる事ができるってことだけです。でも並行に走らせる事が出来ればいろいろ便利ですよね。 でもマルチスレッドプログラミングで一番困るのが排他制御。これを上手くやってやらないと、OCaml で type safe なはずなのに、 segfault という事になります。もちろん OCaml プログラマは普段から type safety に慣れきっているので、 type system で保障されない排他制御を完璧に書けるはずがないのです。心が折れます。 そこで、light weight thread。こいつは実は thread じゃありません。要は同一スレッド内でタスク関数をとっかえひっかえ asynchro

    超簡単にオモチャ LWT を実装してみた - camlspotter’s blog
  • State パターンっていうの?ああいうやつ? - camlspotter’s blog

    2ch にこんなんあったよ。 オブジェクトを使わずにステートマシンを作るのによい方法はありますか? 勉強のためにStateパターンをモジュールを使ってやってみようと思ったのですが、 相互依存を回避するうまい方法が思いつきません。 また、状態をそれぞれ別モジュールにするにせよ、一箇所にまとめるにせよ、動的に切り替えるためには 結局パターンマッチさせてそれらを呼び出すようになると思いますが、もっとスマートな方法はありますか? 私はデザインパターン何それ美味しいのという人なので、まずよく判りませんでした。 流れ: キャラクタがバイトをして財布がいっぱいになったら銀行へ行く ということを目標金額まで繰り返し、到達したらその金がなくなるまで 家でごろ寝し、なくなったらまた働く キャラクタは ・バイトをする : 手持ちが1増える ・銀行で貯金をする : 手持ちを0にし、貯金が1増える ・家で寝る : 

    State パターンっていうの?ああいうやつ? - camlspotter’s blog
  • Concurrency - camlspotter’s blog

    Concurrent ML の ivar in OCaml, Concurrent Cell: http://d.hatena.ne.jp/osiire/20081011 ウチでも同じようなことをしております(が、クローズドなので)。なのでこれには注目していきたい! OCaml で multi thread なプログラムを書くと、初めのころは、大抵、 Thread.create! 媚びろ〜!! 媚びろ〜!! 俺は天才だ ファハハハ!! な感じで初期アミバ様状態なのですが、油断していると、というか、大体すでに CAMLC=ocamlc -thread としている時点でアミバ的に油断しているのですが、 お前(のプログラム)はもう死んでいる。もう1000行書いてみろ 心配するな おれは天才だ おれに不可能はない!! Mutex.lock! Segmentation fault うわっ うわああ 

    Concurrency - camlspotter’s blog