タグ

ブックマーク / keigoi.hatenadiary.org (24)

  • ビットとview pattern - keigoiの日記

    小ネタ。 ビットパターンをHaskellでパターンマッチできたらいいよね、ということでview patternを使ってみた。 {-# LANGUAGE ViewPatterns #-} import Data.Bits -- | ビット。 I は 1, O は 0 data B = I | O deriving Show -- | 8ビット。 左がMSB, 右がLSB data Byte = B B B B B B B B B deriving Show bool2b :: Bool -> B bool2b True = I; bool2b False = O bit' :: Bits a => Int -> a -> B bit' i b = bool2b $ testBit b i -- | view patternで使う関数 bit8 :: Bits a => a -> Byte b

    ビットとview pattern - keigoiの日記
  • 実務で使うOCaml - 泥臭い仕事をサクっとこなす方法 - keigoiの日記

    プログラマが実務で出会うのは、問題が整理されたキレイな仕事ばかりじゃない。プロダクトに質的じゃない部分でもプログラムを書く必要に迫られる。いわゆる開発方法論では抽象化されてしまう、今ここにいるソフトウェア開発者の悩みだ。 今日は、私が仕事で書いたOCamlのコードを晒して、如何にOCamlがプログラマの仕事の道具として優れているかを主張したい。泥臭く、関数的でない、エレガントさのかけらもない、生活臭のあるコードだ。勤務先はOCamlをメイン言語として使っている。研究所とかではなく普通に受託開発を生業としている会社だ。OCamlは理論一辺倒で、マニア向けで、現実のソフトウェア開発には使えない、という誤解が万が一あるかもしれないが、全くそんなことはない。 (Haskellもそうだけど、それはまたの機会に) いかにOCamlが優れているかについての概論めいた話は、OCamlを数十人体制で10年

    実務で使うOCaml - 泥臭い仕事をサクっとこなす方法 - keigoiの日記
  • 型クラスで tagless DSL メタプログラミング - keigoiの日記

    これは Haskell Advent Calendar 2011 の5日目の記事です。 去年も書きましたが、その記事はこちら → Haskell厨を6年やってる俺がOCamlを仕事で2ヶ月使ってみた - keigoiの日記 先日の記事 Haskell+タグレスな型付きDSLで楽々!C言語コード生成 - keigoiの日記 をちょっとブラッシュアップした。前回はコードについては全く説明しなかったので、改めて解説する。 おさらい HaskellやOCamlなどの関数型言語は、プログラミング言語の処理 ― 構文解析とコード生成 ― がとても得意だ。 大手のソフトウェア企業として知られる NTTデータも既存コードの処理 (構文解析〜リバースエンジニアリング) のために Haskell を使っているそうだ。 (函数プログラミングの集い2011より。インドに外注する部分もあるそう togetter 1

    型クラスで tagless DSL メタプログラミング - keigoiの日記
  • OCamlコードをCoqで検証できる "CFML" で 証明コンペに挑戦 (未完) - keigoiの日記

    VSTTE 2012 Software Verification Competition というソフトウェア検証のコンペがあった。参加はオープンで、問題文もPDFで配布されている。 id:yoshihiro503 がチームtebasakiというチームでがんばっていた。僕はCoqに慣れていなかったのでチームに入るのは見送った(というかチームの人数上限4人で入れなかった)。 仕事や出張の片手間でやっていたので、結局一問も検証できなかったけど、楽しかった。 検証にはCFMLというツールを勉強しながら使った。 これを使えば OCaml のソースコードを Coq で検証できる。 それも ref型による破壊的代入つきの手続き的なOCamlを含む。 そして Coqと違い、プログラムは停止しなくてもいい。 つまり、CFMLを使えば、 手続き型プログラムを、ホーア論理+分離論理(のようなもの;後述)を使って

    OCamlコードをCoqで検証できる "CFML" で 証明コンペに挑戦 (未完) - keigoiの日記
  • Haskell+タグレスな型付きDSLで楽々!C言語コード生成 - keigoiの日記

    関数型プログラミング言語とコード生成 HaskellやOCamlなどはコンパイラなどの言語処理系の実装を得意としている。さすがに日常的にコンパイラを実装している人はそう多くないと思うけど、例えばコード自動生成はすぐ試せる割に効き目が大きく、仕事を効率化する方法としてぜひ試してみたい選択肢だ。 今回は、Haskellの言語内DSLからC言語のコードを生成する方法(の一つ)を簡単に紹介する。 この方法で、Haskell上のEDSLを使って (1) C言語のソースコードを生成でき、 (2) Haskellの式として評価できる。 このように、わざわざパーサを書かなくても、コンビネータを適当に作ればすぐにDSLを作ってしまえるのも、関数型言語の魅力かもしれない。 taglessな方法 ただし、ちょっと他と違う方法を試す。 OlegさんのサイトにTyped Tagless Interpretation

    Haskell+タグレスな型付きDSLで楽々!C言語コード生成 - keigoiの日記
  • マルチスレッドなFFIの実装 - keigoiの日記

    マルチスレッドでOCamlからCを呼ぶ場合、または CからOCamlにコールバックする場合、 C側からOCaml のデータを触るとき C側からOCaml のコードを呼ぶとき は、その部分を (OCamlを触らないコード) leave_blocking_section(); (OCamlを触るコード) enter_blocking_section(); (OCamlを触らないコード) のように配置する*1. 2目のスレッドがOCaml側にやってきたときは、leave_blocking_sectionでコンテキストスイッチまで待たされることになる。 注意: camlspotterさんの記事 等も参考にすること。 実際にFFIでCのコードに入った直後は他のOCamlスレッドがブロックされているので、enter_blocking_section() して、 fopen などブロックする関数を呼び

    マルチスレッドなFFIの実装 - keigoiの日記
  • Ocsigen/Eliom と PG'OCaml を使った Web開発サンプル (OMakefile付き) - keigoiの日記

    明日の OCaml Meeting Tokyo 2009 で Eliom/Ocsigen について LTします! これに備えて、 Eliom と PG'OCaml を使ったサンプルアプリを準備しました! Eliom は OCaml 用の Webプログラミングのライブラリです。 Ocsigen上で動作します。 OCaml の静的型付けによる安全性や多相バリアントの柔軟な性質を生かして… 必ず(ほぼ?)validなXHTMLを生成します HTTPのリクエストパラメータとフォームの型が整合するため入力値の復元や検査のためのコードが不要です PG'OCaml は、 OCaml から PostgreSQL にアクセスするためのライブラリです。 ソースコードに埋め込んだSQL文と OCamlコードの型整合性をコンパイル時に検査してくれます. オブジェクト指向言語における O/R マッパーのようなもので

    Ocsigen/Eliom と PG'OCaml を使った Web開発サンプル (OMakefile付き) - keigoiの日記
  • pa_monad を通して camlp4 のコマンドラインを思い出す - keigoiの日記

    pa_monad は OCamlで モナドを使いやすくするための構文拡張だ. ついこの前 id:camlspotter さんが pa_monad の拡張を書いてくださった.ありがたや. 早速使ってみようと思い,コンパイルした.hg clone https://bitbucket.org/camlspotter/pa_monad_custom でダウンロードしたあとは make一発です. ただ,ちょっと ocamlc から試そうと思ったら,俺 camlp4 のコマンドラインオプションを全然覚えてないよ,ということに気づいた. いつも忘れるので書いておく. ocamlc -pp 'camlp4of pa_monad.cmo' a.ml ocamlc/ocamloptのオプション -pp に続けてプリプロセッサのコマンドラインを書く. しかしそもそも camlp4of とはなんだろう? caml

    pa_monad を通して camlp4 のコマンドラインを思い出す - keigoiの日記
  • Ocsigen/Eliomの入力値検査 - keigoiの日記

    Ocsigenで簡単なサンプルを書いた。 簡単すぎて悲しくなるけど、最初はこんなもんだろう。今週でこれをそこそこの規模に成長させる予定です。 足し算アプリ Struts にあるような入力値の検査機能(その業界ではバリデーションといいます)はOcsigenにはないので、自前で実装した (iferror関数) 入力値はページを移動すると消える 手順 以下、前回 の通りにライブラリがインストールされているとして: test.ml を、 ocamlfind ocamlc -c -thread -package ocsigen -pp "camlp4o /opt/local/lib/ocaml/site-lib/ocsigen/xhtmlsyntax.cma -loc loc" test.mlでコンパイル。 test.cmo を生成。 /etc/ocsigen/ocsigen.conf <host

    Ocsigen/Eliomの入力値検査 - keigoiの日記
  • OCaml toplevel on Android : マジカルなラクダをAndroidで飼おう - keigoiの日記

    Androidで動作するOCamlインタプリタ OCaml toplevel on AndroidAndroid Market に公開しました。 OCamlのトップレベル(インタプリタ)をAndroid上で操作できます。 enjoy! 仕組み OCamlトップレベルはネイティブ実行されます(OCamlバイトコード+libcamlrun.a)が、AndroidのアプリはJava VM(dalvikvm)上で動作するため、両者のブリッジが必要でした。 いくつかの方法があり、一部は先日書きましたが、今回の OCaml toplevel on Androidはこのなかのどれでもない、最もイージーな方法を使っています…。 それは 「あるスレッドでocamlトップレベルをバイトコード実行し、標準入出力を介してAndroidアプリのメインスレッドと通信する」という方法です。 stdoutを入力とし

    OCaml toplevel on Android : マジカルなラクダをAndroidで飼おう - keigoiの日記
  • OCamlベースのAndroidアプリに向けて - keigoiの日記

    O'Caml on Android というパッチを作っている. 柔軟かつ信頼性の高いOCamlでAndroidのアプリを書くのが目標だ. ここ2ヶ月ほどocamljs (OCamlからJavaScriptへのコンパイラ) を使っていて、OCamlの信頼感と柔軟性にとても満足したので,ではAndroidでもOCamlだ、とばかりに開発を再開している. iPhoneiPadのObjective-Cと違い,AndroidではJavaの型の扱いやJVMとの相互作用が必要でありなかなか厄介だ. しかしiPhoneではいくつかの開発 事例もあるのでAndroidでもそれなりに有効ではないかと信じている.がんばりたい. OCamlを使う利点 もはや自分の中では言い古した感があるのだけど,念のため列挙してみる. 信頼性 OCamlには null値がない.このため NullPointerException

    OCamlベースのAndroidアプリに向けて - keigoiの日記
  • Haskell厨を6年やってる俺がOCamlを仕事で2ヶ月使ってみた - keigoiの日記

    Haskell Advent Calendar jp 2010のためのエントリです(17日目). 6日目の id:camlspotterさんの 経験15年のOCaml ユーザーが Haskell を仕事で半年使ってみた に対するカウンター(になってるかどうか分からないですが)みたいな感じです. 近くて遠い隣人:HaskellとOCaml OCamlはHaskellと違って副作用があり,更にHM型推論をもつためプログラマは質的な部分の記述に注力しつつ,コードのチューニングもできる. つまり働くHaskellプログラマがシリアスなソフトウェアを書く時に使えるほとんど唯一の選択肢だ.しかし,同じ静的型付けの関数型言語でありながら,OCamlとHaskellの見た目はかなり異なる. この記事では, HaskellプログラマがOCamlを使い始めると,どういうトラップにハマるかを書く. なかでも,

    Haskell厨を6年やってる俺がOCamlを仕事で2ヶ月使ってみた - keigoiの日記
  • ocamljs を使おう : OCamlからJavaScriptへの変換 - keigoiの日記

    ocamljs は OCamlから JavaScript へのトランスレータだ。前回の記事と順番が逆になってしまったけれど今回はocamljsについて書く (基的に http://jaked.github.com/ocamljs/ 以外のことは書いてないです。)。 JavaScript歴史的経緯とその簡潔さからwebブラウザで使われているが,静的型付けでないので信頼性の面でいまいち不安だったり、言語の使いやすさの面でもパターンマッチの構文が無いとか、まともなモジュールシステムがないとかで良くない。 ocamljsを使えば、比較的安全・簡潔に大規模かつ動的なwebページを構成できるかもしれない。 ocamljsは残念ながらまだ成熟しているとはいえないが、実は既にすごく高機能だ。 現バージョンで既に DOM や jQuery を OCaml から操作できるし、いざとなれば JavaScri

    ocamljs を使おう : OCamlからJavaScriptへの変換 - keigoiの日記
  • CPSチェイン - keigoiの日記

    追記:「東京Node学園#1「非同期プログラミングの改善」のエッセンス」というスライドで、似たようなテクニックが使われているのを見た(p.32-)。 そんなにスジは悪くないのかもしれない。 JavaScriptでは非同期的に関数を呼ぶことが多い。例えばimgタグのロードが終わったら次にAを処理して、それが終わったらBをして…など。 こういうときCPS形式でプログラムを書くはめになる。 func1(arg1, function(res1){ func2(arg2, function(arg3, res2){..})}) かようにJavaScriptでは関数リテラルがすこぶる扱いづらい -- 'function' とか 'return' とか {} のネストとか…あとカリー化するにも一苦労 -- JavaScriptプログラマはどう書くんだろう? こういう非同期呼び出しをうまく同期的に記述する

    CPSチェイン - keigoiの日記
  • Language.C を使ってC言語のソースコードを解析する (with Data.Generics) - keigoiの日記

    Language.CはHaskell用の、C言語のソースコードを構文解析するライブラリである。 Language.CはパーザとともにC言語の構文木に相当するデータ型を提供しており、C言語のソースコードをHaskellのデータとして操作可能である。このため、Language.CはC言語のコードを色々と解析・変換するのに便利である。さらに意味解析に役立ついくつかの補助関数も定義されている。 組込みソフトウェアに関する研究で必要になったため、Language.C を用いてC言語のソースコードを変換する簡単なプログラムを書いた。 動機 JHC (Haskellのコンパイラ;ISO C互換のコードを吐く)は Haskellのソースから C99のコードを生成する ツール(ARMバイナリを生成するコンパイラ)の制約でgcc 2.95(19991024)しか手元にない。 gcc 2.95はC89しか受け付

    Language.C を使ってC言語のソースコードを解析する (with Data.Generics) - keigoiの日記
  • hint から Template Haskell を使って reify - keigoiの日記

    下の記事の続き。 hintは意外に私の欲しい機能がなく、たとえば「あるレコード型のフィールド名をすべて取得」みたいなことができない。Template Haskell の reify 関数なら、任意の識別子について reify が使えるののに… というわけで、 ややアクロバティックだけど、Template Haskellでreifyしたデータを、 hintのinterpret関数でこちら側にもってくる、というコードを書いた。 必要なライブラリはhintのみ。 使い方 まず、下で説明する Meta.hs をカレントに置く。 下の Foo.hs から module Foo where data Point = Point {x::Int, y::Int} Point型の情報を取り出して、そのままprintする. $ ./Main Foo Point Right (TyConI (DataD []

    hint から Template Haskell を使って reify - keigoiの日記
  • hint 使って型推論、 haskell-src-exts を使って Parse - keigoiの日記

    GHC API のラッパー hint を使えばHaskellでも手軽にリフレクションっぽいことができる。例えば動的にHaskellのソースをロードして関数を呼び出す、といったことが数行で書ける。 ところでリフレクション周りで色々やろうとすると、すぐに関数の型を解析したくなるのだけど、hint は 型推論の結果を文字列で返すのでHaskell的には使いにくい。情けない話だが、どうやら GHC APIがそうなっているので仕方ないようだ。Haskellのパーサが必要になる。 haskell-src-exts を使えば、Haskellの型をparse できる。 似たようなことをやる方法に template haskellとか haskell-src という標準のアレがあるけれど、いくつかの拡張構文をサポートしていない。その点 haskell-src-exts はほぼすべての GHC拡張をサポートし

    hint 使って型推論、 haskell-src-exts を使って Parse - keigoiの日記
  • full-sessions-0.6.1 - keigoiの日記

    full-sessionsの新バージョン 0.6.1 を HackageDBにアップロード しました。 full-sessions は、Haskellにおけるマルチスレッド/ネットワークプログラミングのライブラリです。 Sessionモナドという新しいモナドを使ってプログラムを書きます。 チャネルの型表現にπ計算の型理論の一つであるセッション型を採用しています。セッション型のおかげで、チャネルの「使われ方(プロトコル)」がスレッド間で整合していることを実行前の型検査によりチェックできます。これにより、ある種のデッドロックや型の不整合は型検査で排除できるようになります。 さらにHaskellの型推論でセッション型を推論させれば、プログラムがチャネルを意図通りに使っていることを型表現からチェックできます。 full-sessions は、HList等で見られるような型レベルプログラミングのテク

    full-sessions-0.6.1 - keigoiの日記
  • 何故か書いてしまったduck typing (Haskell,存在型+型クラス) - keigoiの日記

    存在型+型クラスでduck typing. 参照:http://www.haskell.org/haskellwiki/Existential_type 既に言及されてますが、このやり方だとHaskellはnonintrusive-explicit-dynamic に該当しますね。 テーブル修正しました。 class Duck a where quack :: a -> IO () data Dog = Dog data Cat = Cat -- non-instrusive -- -- 犬はアヒルだ instance Duck Dog where quack _ = putStrLn "wuff!" -- もアヒルだ instance Duck Cat where quack _ = putStrLn "meow." data DuckObj = forall a. Duck a =>

    何故か書いてしまったduck typing (Haskell,存在型+型クラス) - keigoiの日記
  • Alloyでパックマン - keigoiの日記

    Alloyを使ってみた。 数年前に使ったときはなんでこんなの使うのと思っていたけど考えが変わったのだ。 ちょっとした規模のプログラムを書くには設計が必要だ。 コードを書く前に、問題の質的な部分を知っておこう。 質がわかっていれば、 適切な部分にモジュール分割したり、適切なライブラリを選択したり、アルゴリズムを書いたりできるはずだ。 もちろんお絵描きツールでもいいのだけど、動いたりチェックしたりできれば、設計で得られる知見はより多くなるはず。 述語論理で書くけれど、モデルが絵になるのが直感的でよい サクサク設計するために Alloy が使えないか ? Alloyについて Alloy は 一階述語論理でモデルを書く。 だから概念は Prolog に近いかもしれない。 いわゆる公理的意味論というやつだ。 が書ける述語はホーン節に限らず自由である。 モデルと制約を自由に書ける。 そのかわり?

    Alloyでパックマン - keigoiの日記
    nsyee
    nsyee 2009/09/08