2008年10月29日
やっぱCommon Lispでゲーム作りたいよねぇ
というあまりに強引なむちゃぶりですが、ようやく最低限のページが出来たのでこっちのブログで宣伝します。
まず、LISPでゲーム開発する際のライブラリといえば、やっぱりSDLです。じゃあLISPでSDLを使うためのライブラリといえば何があるかというとLispbuilder-SDLというのがあります。
-Pegasus' Wing SIDE_K memo- - Lispbuilderについて
じゃあ、次に何がしたいかというと、やっぱ自分の環境で動かしてみたいよねぇ、ということでこんなページを用意しています。
-Pegasus' Wing SIDE_K memo- - LISP処理系およびLispbuilderのインストール
しかもLISP処理系のインストール方法から丁寧に記述しています。さらに用意している環境はWindows、Linux、MacOSXの3つ。これ以上何を言う必要があろうか、いや、ない。
もちろんこれからまだまだコンテンツは増やす予定です(というか手元にネタは転がっているのですが、なかなか書く時間が・・・)
- winodowsでのEXEバイナリの作成方法(SBCL、CLISP両方)
- sdl-examplesでの動作しないサンプルの動作方法(ちょっとめんどくさいんだな、これが)
- lispbuilder-sdl以外のライブラリ(gfxやimage、ttfなど)のインストール。とりあえずwindows+SBCLではたいていうまくいってるっぽい
こうご期待、ということで。
投稿者 mak : 01:47 | コメント (2) | トラックバック
2008年10月 5日
実践Common Lispを読んでみる(その4)
さて、1週間ほどあいてしまいましたが相変わらずぼちぼち読み進めています。今日は9章までのまとめでも。
まずは変数の話。当然common lispにもローカル変数(レキシカル変数)というのがあるわけdすが、もしこのレキシカル変数を無名関数内で使ったらどうなるかというのがこのサンプル。
(defparameter *fn* (let ( (count 0)) #'(lambda () (setf count (1+ count)))))
defparameter(グローバル変数)の定義として、無名関数を使用してますが、この初期化はいつ行われ、いつ行われないのか。答えは、次の結果を見てから。
CL-USER> (funcall *fn*) 1 CL-USER> (funcall *fn*) 2 CL-USER> (funcall *fn*) 3
つまり、count = 0となるのは最初の1回かぎりであとはcount++が延々と呼び出されます。これがクロージャによる束縛という機能、らしいです。一度letによってcountを束縛すると、次にletを呼び出したとしてもその束縛が延々と続いているので初期化のルーチンは実行されない、ということです。
次はdefvarとdefparameterの違い。どっちもグローバル変数の宣言時に使用しますが、違いはdefparameterは呼び出すたびに初期化され、defvarは最初しか初期化されないこと。なのでdefvarで宣言した変数を初期化する場合はsetfとか使わなければならないということです。setfは変数を代入する際に使用するメソッドです。
続いてマクロ。lispでいうマクロとは、コードを生成するコードのことで、その生成されたコードを別のコードが実行するのが一連の流れですが、このあたりは分かっていても慣れないと難しいです。9章とか読んでもまだわかんないですが、とりあえず先に進みたいと思います。
あと個人的なメモ。- シングルクオート(shift+7)、シングルクオートの次に書いている変数は評価されない
- バッククオート(shift+@)、バッククオートの次に書かれている式全体が評価されない
- コンマ、バッククオート内の式の内、評価されたい変数は前にコンマを書く
うーん、覚えられない・・・。
追記、現在common lisp+SDLの環境をいろいろ調べています。またある程度わかり次第wikiにでもまとめます。現状としてはwindowsバイナリまでなら作成可能です(CLISPで、ですが)。でも一番の鬼門はwindows上でまともなLISP処理系がないことですが・・。
投稿者 mak : 01:40 | コメント (0) | トラックバック
2008年9月28日
実践Common Lispを読んでみる(その3)
さて、しばらく開きましたがぼちぼち読んでいます、はい。今日は第5章まで読んだのでそこまでのまとめでも。
まずは前回の訂正から。ime-onoff-slimeが実はまだおかしかったのでこのように修正しました。
(defun ime-onoff-slime () (interactive) (if slime-mode (progn (slime-mode nil) (toggle-input-method)) (if (string= major-mode "lisp-mode") (progn (slime-mode t) (toggle-input-method)) (toggle-input-method)) ) )
これでとりあえず私の希望通りには動いてくれました。調べて分かったのですが、上記のstring=ってそれだけで文字列比較のマクロらしいです、へぇ。
第3章でCDデータベースを作りながらいろいろCommon Lispの解説を行い、4章から具体的な説明に入りました。
覚えたコマンド- C-c C-k (slime-compile-and-load-file) ファイル全体をコンパイル+ロード
- C-c M-k (slime-compile-file) ファイル全体をコンパイルするのみ
- C-M-q (indent-sexp) (開き括弧で)式全体のインデントを修正
- C-c M-q (slime-reindent-defun) 関数の本文全体のインデント修正
あと、C-c C-cはあんまり使わずにこれからはC-c C-kを使う方向で。C-c C-cはその関数しかコンパイルしてくれないので、複数の関数を定義してまとめてコンパイルしたい場合はC-c C-kがいいです。あと、同じ関数名で定義してしまいエラーとなったらREPLでloadしなおしてください。
それとコメントの定義でこんなことがかかれてました。- ;;;; (セミコロン4つ)・・・ファイルヘッダのコメント
- ;;; (セミコロン3つ)・・・後に続く大きなコードセクションに対する段落関数(関数全体の説明)
- ;; (セミコロン2つ)・・・以降のコードに対するコメントであることを示す、そのため,以降に続くコードと同じインデントにする
- ; (セミコロン1つ)・・・特定の行にだけに対するコメント
- defun・・・関数定義、順番に評価され、最後の式の値が返り値となる
- &optional・・・引数が与えられていればそれを使用し、ない場合はデフォルトの値かNIL
- &rest・・・引数をリストにして渡す
- &key・・・シンボルとパラメータを引数として使う
投稿者 mak : 01:43 | コメント (1) | トラックバック
2008年9月25日
実践Common Lispを読んでみる(その2)
さて、本来なら第3章を読みたいところですが、案の定日本語関係でいろいろミスったのでそれについて。
とりあえず修正した.emacs.elファイルを。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; emacs-lisp-mode(下のslimeモードとelispモードを分けるため) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (setq auto-mode-alist ;;; 拡張子とモードの対応 (append '(("/.el" . emacs-lisp-mode)) '(("/.emacs-*" . emacs-lisp-mode)) '(("/.wl" . emacs-lisp-mode)) auto-mode-alist)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;slime ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (add-to-list 'load-path "/usr/share/emacs/site-lisp/slime/") (require 'hyperspec) (setq common-lisp-hyperspec-root (concat "file://" (expand-file-name "~/.emacs.d/HyperSpec/") ) common-lisp-hyperspec-symbol-table (expand-file-name "~/.emacs.d/HyperSpec/Data/MapSym.txt") ) (defun ime-onoff-slime () (interactive) (if slime-mode (progn (slime-mode nil) (toggle-input-method)) (progn (slime-mode t) (toggle-input-method)))) (require 'slime) ;; 日本語利用のための設定(emacsのデフォルトがutf-8ならutf-8-unix) (setq slime-net-coding-system 'euc-jp-unix) (setq inferior-lisp-program "sbcl") (add-hook 'inferior-lisp-mode-hook (lambda () (inferior-slime-mode t))) (add-hook 'lisp-mode-hook (lambda () (slime-mode t) (show-paren-mode) (global-set-key "\C-cH" 'hyperspec-lookup) (global-set-key "\C-\\" 'ime-onoff-slime) ) ) (slime-autodoc-mode) ;以下前と同じ
どうもslime-spaceがanthyの変換キーより先に有効になってしまうので、slime-modeでかつ日本語入力モードにしたときはslime-modeを切ってからtoggle-imput-modeでanthyに切り替えるようにしました。んでもてって(global-set-key "\C-\\" 'ime-onoff-slime)で
slime-modeの時のみ有効になるように設定。
また、emacs-lispと通常のlispを分けるために新しくemacs-lisp-modeを追加しました。
あと意外と引っかかったのが文字コード設定。今うちの環境はデフォルトの文字コードをEUC-JPに統一しているのでそれに併せてslime-net-coding-systemもeuc-jp-unixにしないと日本語コメントありの*.lispファイルを読み込めない(正確にはREPLでloadしようとすると怒られる)というすげーいやな問題が発生します。
やっとこれで日本語コメントありのファイルを生成できるようになった・・・、っていうかここで今日はダウンきゅー・・・。
投稿者 mak : 03:44 | コメント (13) | トラックバック
2008年9月24日
実践Common Lispを読んでみる(その1)
ついにCommon Lispに浮気することにしました。とりあえず今日は第2章までとそれ以前の問題として環境構築のお話を。
当方の環境:Debian(etch)においてとりあえずインストールするものは
$ sudo apt-get install slime sbcl hyperspec
これで一通りのファイルは取得できます。hyperspecは/root/tmp以下に保存されたので自分のhomeの.emacs.dフォルダ以下に展開しておきました。
続いて.emacs.dの編集
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;slime
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(add-to-list 'load-path "/usr/share/emacs/site-lisp/slime/")
(add-hook 'lisp-mode-hook (lambda ()
(slime-mode t)
(show-paren-mode)))
(require 'hyperspec)
(setq common-lisp-hyperspec-root
(concat "file://"
(expand-file-name "~/.emacs.d/HyperSpec/")
)
common-lisp-hyperspec-symbol-table
(expand-file-name "~/.emacs.d/HyperSpec/Data/MapSym.txt")
)
(require 'slime)
(setq slime-net-coding-system 'utf-8-unix) ;; 日本語利用のための設定(Lisp 環境側の対応も必要)
(setq inferior-lisp-program "sbcl")
(add-hook 'inferior-lisp-mode-hook (lambda () (inferior-slime-mode t)))
(add-hook 'lisp-mode-hook
(lambda ()
(slime-mode t)
(show-paren-mode)
(global-set-key "\C-cH" 'hyperspec-lookup)
)
)
(slime-autodoc-mode)
;; These are the 3 CL implementations that currently work with SLIME/Win32:
;; (Note: Unless you want to try out all 3, you only need one of these functions)
;; CMU Common Lisp - http://www.common-lisp.net/project/cmucl
(defun cmucl-start ()
(interactive)
(shell-command "~/local/bin/lisp -core ~/local/lib/cmucl/lib/user.core -load ~/.slime.lisp&"))
;; SBCL
(defun sbcl-start ()
(interactive)
(shell-command "sbcl --core ~/local/lib/sbcl/main.core --load ~/.slime.lisp &"))
;; GNU CLISP - http://clisp.cons.org/
(defun clisp-start ()
(interactive)
(shell-command (format "clisp -K full -q -ansi -i %s/.slime.lisp &" (getenv "HOME"))))
えー、google-code-prettifyがlispに対応してないので若干コードが見づらいですが基本的にはEmacs による Lisp Hackingをそのままコピペしただけです、はい。
作業は全部Emacs上で行います。基本的な流れとしては- M-x slimeでREPL(対話式のLispバッファ)を起動
- 直接REPLでLispを実行するか、別バッファでLispファイルを編集しコンパイルしてからREPLで評価
- C-c C-q (slime-close-parens-at-point) 必要な閉じ括弧を全て閉じる
- C-c C-c (slime-compile-defun) 関数定義をLispに送信し、評価、コンパイルを行う
- ,(slime-handle-repl-shortcut) コマンドを入力するプロンプトを表示、ここでquitかsayoonaraでslimeを終了
ついでになんとなく画面写真を載せてみる