2010-01-01から1年間の記事一覧

全角文字列を半角文字列に変換する。

import Char (isDigit) toHanDigit :: String -> String toHanDigit = toDigit.zenToHan -- 数字以外は無視します。 toDigit :: String -> String toDigit [] = [] toDigit (x:xs) = if isDigit x then x:toDigit xs else toDigit xs zenToHan :: String -> …

テキストボックス(textEntry) の大きさを設定する。

frame や button は clientSize でオブジェクトの大きさを変更しますが、テキストボックス(textEntry)は clientSize の値を変更してもオブジェクトの大きさは変化しません。 [wxhaskell-users] Size of an entry field に minsize を使う方法が紹介されてい…

ダイナミックスコープ

関数で定義した局所変数に、ほかの関数からアクセスできる場合がある。 (defun foo () (let ((a "Hello")) (print a) (bar))) (defun bar () (print a)) (setq a "world") (bar) ;; => "world" (foo) ;; => "Hello" "Hello" (Emacs Lisp の場合) "world" (Co…

シェルピンスキーのギャスケット

Wikipedia パスカルの三角形の記述に「パスカルの三角形の奇数のみを塗りつぶすと、シェルピンスキーのギャスケットの一部分が出現する」と言う説明がある。 ;; x から max までのリストを作って返す。 ;; (mk-list 1 10) ;=> (1 2 3 4 5 6 7 8 9 10) (defun…

Common Lisp でパスカルの三角形(末尾再帰)

パスカルの三角形は数を三角形状に並べた物で、最上段に1があり、そこから下の行はその位置の右上の数と左上の数の和を記入して行ったものです。 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1(x:3 Y:6)の値は(x:2 Y:5)と(x:3 Y:5)の和。(x:2 Y:5)の値は・・・と再帰で求め…

Common Lisp でフィボナッチ数列(末尾再帰)

フィボナッチ数列を末尾再帰で求める。 (defun mk-list (x max) (if (= x max) (list max) (cons x (mk-list (+ x 1) max)))) ;; 二重再帰 (defun fib (x) (cond ((= x 1) 1) ((= x 2) 1) (t (+ (fib (- x 1))(fib (- x 2)))))) (mapcar #'fib (mk-list 1 10…

Common Lisp でハノイの塔を解いてみる。

再帰を使うと美しく簡潔に解けることで有名な『ハノイの塔』を Common Lisp で塔の状態を表示しながら解いてみます。 ;; 三つある塔それぞれを表現します。 ;; 三つの塔を作ります。 ;; 塔"A"の重ねてあるリングを塔"B"に移動したい。 (setq tower-a '("A" (…

Common Lisp でエラトステネスの篩

Common Lisp でエラトステネスの篩をやってみてハマったところ。 make-list という関数は定義できません。 null? がないので atom を使った。 余りを求める関数は mod 。 ;; x から max までのリストを作って返す。 ;; (mk-list 1 10) ;=> (1 2 3 4 5 6 7 8 …

SBCL(Steel Bank Common Lisp)でコンパイルしてみる。

WIndowsからLispでCOMを使いたい思い調べましたところ、Steel Bank Common Lispが良さそうなのでインストールしてみました。 SBCLについては紫藤のWiki:SBCL(Steel Bank Common Lisp)に詳しい紹介があります。LISP で win32ole を使いたい訳です。 Common Li…

newtype を作ってみる

やさしい Haskell 入門 (バージョン 98 ) 6 再び、型について 6.1 Newtype 宣言 を参考に newtype を作ってみます。 newtype Age = Age Integer deriving (Eq, Read, Show) toAge :: Integer -> Age toAge x | x < 0 = error "Can't create negative age!" |…

Data.HashTableを使ってみる。

Data.HashTable new (key -> key -> Bool) -> (key -> Int32) -> IO (HashTable key val) 新しいハッシュ表を作る。最初の引数は key を比較する関数、2番目の引数は key を Int32 に変換する関数。(Int 用の hashInt、文字列用の hashString がある。) 参…

数値(Numeric):読み込み関数

The Haskell 98 Report 14 数値 14.2 読み込み関数 lexDigits :: ReadS String は 10 進数の空ではない文字列を読み込む。 > :m + Numeric > :t lexDigits --=> lexDigits :: String -> [(String, String)] > lexDigits "12345" --=> [("12345","")] > lexDi…

Data.List.Split を使ってみる。

Data.List.Split はリストを分割するためのライブラリです。 インストール は cabal install split で OK。 > cabal install split Resolving dependencies... Downloading split-0.1.2... Configuring split-0.1.2... (snip) Reading package info from "di…

「Real World Haskell」読書メモ 7.入出力 7.1 Haskellにおける古典的入出力

return は純粋な値を IO アクションでくるんで返す。 Prelude> :t "Hello,world!" "Hello,world!" :: [Char] Prelude> :t return "Hello,world!" return "Hello,world!" :: (Monad m) => m [Char] Prelude> h <- return "Hello,world!" Prelude> :t h h :: […

wxHaskell を使ってみる(2)

以下を参考にしました。 wxWidgets Reference manual : どんなライブラリがあるか調べるのに役立ちます。 Documentation for wxHaskell 0.10.3 : wxwidget のHaskell での定義。 Index of /wxhaskell/samples/wx : サンプル。 WxHaskell/Quick start WxHaske…

wxHaskell を使ってみる。

サンプルをゴニョゴニョいじってみる。 (:=) でプロパティをセット。 module Main where import Graphics.UI.WX main :: IO () main = start hello hello :: IO () hello = do f <- frame [text := "日本語はUTF8で!"] p <- panel f [] title <- get f text …

wxHaskell をインストールする

「Real World Haskell」は Gtk2hs を紹介していますが wxHaskell は移植性が高く、ネイティブAPIを呼んでいますから綺麗で、パーツも豊富そうです。 wxWidgets については「wxWidgets でクロスプラットフォーム GUIアプリを作ろう」に詳しく記述されています…

The main function `main' is not exported by module `Main'

「Real World Haskell」読書メモ 4.ライブラリを書く 5.5Haskellプログラムの生成、およびモジュールのインポート -- file: ch05/SimpleJSON.hs module SimpleJSON ( JValue(..) , getString , getInt , getDouble , getBool , getObject , getArray , isNul…

安定ソート

安定なソート(stable sort)とは、 順序的に同等な要素が複数あったときに、その並びが元のまま保たれるもののことを言います。 ソート概要(アルゴリズムとデータ構造) 例えば、個人データを認識するための番号順に並べ、さらに組別に並べても、組ごとに認…

「Real World Haskell」読書メモ(117) 4.ライブラリを書く 5.2 HaskellにおけるJSONデータ表現

-- SimpleJSON.hs data JValue = JString String | JNumber Double | JBool Bool | JNull | JObject [(String, JValue)] | JArray [JValue] deriving (Eq, Ord, Show) Main> :t JString "foo" -- JString "foo"の型はJValue JString "foo" :: JValue Main> :…

「Real World Haskell」読書メモ 4.関数プログラミング 4.12 スペースリークと正格評価

Haskell は遅延評価のために式を展開して計算しないままサンクとしてスタックに保持しています。 下のfoldl (+) 0 (1:2:3:[])を正格評価すれば(0 + 1)の結果である1を保持するのですがそうはしません。 foldl (+) 0 (1:2:3:[]) == foldl (+) (0 + 1) (2:3:[]…

Haskell で SJIS 文字列

Haskell のソースコードにUTF8以外の日本語を記入するとコンパイル時にエラーになります。(コメントはOK) UTF8の日本語を出力するときも、そのままでは出力できず、 utf8-string パッケージをインストールして System.IO.UTF8のputStrLnなどを使用しなけれ…

cabal.exe: user error (Codec.Compression.Zlib: premature end of compressed stream)

Haskell をバージョンアップし、 cabal update を行うと以下のエラーになった。 > cabal update Downloading package list from server 'http://hackage.haskell.org/packages/archive' cabal.exe: user error (Codec.Compression.Zlib: premature end of co…

FFI を学ぶ(3) : 自前のCで書いたCOM で MS-Access、SQL server にアクセスする。

小さいMDBですが、10000回連続読み込みでもOKでした。 XP では正常に動作するが、VISTAではSEGV になった。 XP ではmalloc して LSICD の値を保持しているので ((IDispatch *)pDisp)->lpVtbl->Release( (void *)pDisp) で開放したあと free(pDisp) していた…

FFI を学ぶ(2) : Cの関数とデータをやりとりしてみる。

ffi.c : C側のメモリは Haskell で確保してのを受け取って使うか、malloc で確保して開放する関数を Haskell から呼べば良い、たぶん。 勿論、C で開放できるならその方が楽です。 #include <stdio.h> #include <windows.h> #include <malloc.h> #include <objbase.h> /* CLSID構造体へのポインタを返</objbase.h></malloc.h></windows.h></stdio.h>…

FFI を学ぶ(1) :初めての Foreign Function Interface (FFI)

Haskell からは C の関数が呼べます。 {-# OPTIONS -fglasgow-exts #-} import Foreign import Foreign.C.String import Foreign.C.Types import System.IO.Unsafe (unsafePerformIO) foreign import ccall "math.h sin" c_sin :: Double -> Double foreign …

COM を学ぶ(5) : Mingw で MS-Access,SQL server に接続

COM C

小さい mdb ですけど 10000回連続読み込んでも、メモリ消費は増えませんでした。 参考にしたところ。 Win32OLE 製作過程の雑記 Ruby win32ole.c 「るびま」連載:Win32OLE 活用法 C++ アプリケーションではなく C アプリケーションからOLE オートメーション…

COM を学ぶ(4) : ProgID から CLSID を求める。

COM C

CLSID は GUID の別名として定義されています。 typedef struct _GUID { DWORD Data1; // 4バイト WORD Data2; // 2バイト WORD Data3; // 2バイト BYTE Data4[8]; // 1バイト×8 } GUID; typedef GUID CLSID; typedef GUID IID; ProgID "ADODB.Connection" …

COM を学ぶ(3) : Ruby の invoke メソッドだけでアクセスしてみる。

COMの仕組みを理解しようと Ruby の Win32OLE ドキュメント(win32ole: Ruby Standard Library Documentation)を追ってます。 前回の「COM を理解する(2):CでADODB.Connectionに接続する」にあるテーブルを表現した構造体に invoke がありますが、Ruby の …

COM を学ぶ(2):CでADODB.Connectionに接続する

COM C

GHCはCのコンパイルも出来ます。C言語でCOMクライアントを参考にして、SQL server, MS-Access にアクセスする ADODBConnection に接続してみました。 #include "stdio.h" #include "windows.h" #include "objbase.h" typedef struct tagMyVTable { /* VTable…