2007/12/30

Common Lisp で OLE ライブラリを作りはじめる

Common Lisp の OLE ライブラリ(Ruby の Win32OLE みたいなの)がなかったので作りはじめてみました。
ここ数日せっせとハックしてます。

自宅には Windows マシンがないので OS インストールからでした。
Linux マシンの qemu/kvm に Vista をインストール。
ついで Cygwin, Meadow, SBCL, SLIME, VS2008C++Express, WIN32SDK をインストール。

そしてようやく開発開始です。
C ではコードを書かず、cffi を使って Lisp のコードだけで作成する方針でいきます。
VARIANT の union にやられながら、とりあず BOOL, BST, IDispatch だけを実装して、次のコードが動くようになりました。
IE でページを表示してタイトルを取得しています。
Excel のサンプルを作りたいところですが、Excel を持っていないので。。。とても古いバージョンがどっかにあったかなぁ。

(let ((ie (create-instance "InternetExplorer.Application")))
(property ie :visible t)
(invoke ie :navigate "http://sbcl.sourceforge.net/")
(loop while (property ie :busy)
do (sleep 0.5))
(let ((document (property ie :document)))
(format t "document title is \"~a\".~%" (property document :title)))
(sleep 3)
(invoke ie :quit))

やっぱり名前は cl-win32ole ですよね。

2007/12/29

バレエ発表会 くるみ割り人形

昨日は娘のバレエ発表会でした。
第1部、第2部とあり。なんと第2部はくるみ割り人形の全幕。
一番驚いたのは小学4年生のレベルが高いこと。なんだかとても綺麗で上手でした。去年はそんな印象はなかったのですが、これは来年、再来年とますます期待できそうです。
うちの娘も1回間違えたものの上手に踊っていました。
表情も一番いい笑顔でしたよ。

2007/12/25

[Common Lisp] iconv をアップデート ver 0.4

iconv のまたバージョンアップしました。
UTF-32 等に変換するとバッファが足りなくなるので、errno E2BIG を見るようにしました。
errno を見る方法ですが、SBCL なら sb-alien:get-errno、CMUCL なら unix:unix-errno、その他なら __errno_location を使うようにしました。
あとは CMUCL、32bit、64bit 環境で動かして見つけた不具合を修正。

2007/12/24

[本] Paradigms of Artificial Intelligence Programming: Case Studies in Common Lisp

年末年始のおともに買いました。
amazon.com のレビューで「This book has been called "The best book on programming ever written". 」なんて書かれていましたので。

[Common Lisp] iconv をアップデート

iconv をアップデートしました。バージョン 0.3 です。
変更点は次のとおりです。


  • UFFI をやめて CFFI を使うようにしました。

  • ポータブルな参照方法が見つからなかったので、errno を見るのを止めました。

  • error-p 引数を削除して、返り値の2番目で成功か否かを返すようにしました。

  • from-code と to-code は symbol でも動くようにしました。


ほんとたいしたことのないライブラリなので trivial-iconv とかいう名前にしておけばよかったなぁ。
それはともかく、英語は難しいです。

2007/12/23

[Common Lisp] LTK の味見

Common Lisp の Tk バインディングである LTK をちょっと味見してみました。
CLIM にくらべるとずっと手軽な感じです。
Debian の UTF-8 な環境ですが、日本語の入出力も普通にできました。
最近なんだか Web ばかりですが、GUI のプログラミングも楽しいですね♪

#|
http://www.peter-herth.de/ltk/
(require :asdf-install)
(asdf-install:install :ltk)
|#

(eval-when (:compile-toplevel :load-toplevel :execute)
(require :ltk))

(in-package :ltk)

;;デモ
;;(ltktest)
;;(ltk-eyes)

(defun main ()
(setf *debug-tk* nil)
(with-ltk ()
(let ((btn (make-instance
'button
:text "やあ、LTK♪"
:command (lambda ()
(do-msg "それでは。" "ハローワールド!")
(setf *exit-mainloop* t))))
(txt (make-instance 'text)))
(pack btn)
(pack txt))))

(main)

2007/12/21

再 CLIM(McCLIM) で Hello World! まで

McCLIM の Wiki(McCliki)にある "A Guided Tour of the Common Lisp Interface Manager" を読んでいます。それにのっていた Hello World ですが、"Hello World!" を真ん中に表示するための次のコードがとても気に入りました。
(floor w 2) (floor h 2) :align-x :center :align-y :center
今日はただそれだけです。

(eval-when (:compile-toplevel :load-toplevel :execute)
  (require :mcclim))

(in-package :clim-user)

(define-application-frame hello-world ()
  ((greeting :initform "Hello World!"
  :accessor greeting))
  (:pane (make-pane 'hello-world-pane)))

(defclass hello-world-pane (clim-stream-pane)
  ())

(defmethod handle-repaint ((pane hello-world-pane) region)
  (let ((w (bounding-rectangle-width pane))
  (h (bounding-rectangle-height pane)))
  (draw-rectangle* pane 0 0 w h
  :filled t
  :ink (pane-background pane))
  (draw-text* pane
  (greeting *application-frame*)
  (floor w 2) (floor h 2) :align-x :center :align-y :center)))

(defun run ()
  (run-frame-top-level
  (make-application-frame 'hello-world :width 300 :height 200)))

;;(run)