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つ。これ以上何を言う必要があろうか、いや、ない。

もちろんこれからまだまだコンテンツは増やす予定です(というか手元にネタは転がっているのですが、なかなか書く時間が・・・)

こうご期待、ということで。

投稿者 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章とか読んでもまだわかんないですが、とりあえず先に進みたいと思います。

あと個人的なメモ。

うーん、覚えられない・・・。

追記、現在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-cはあんまり使わずにこれからはC-c C-kを使う方向で。C-c C-cはその関数しかコンパイルしてくれないので、複数の関数を定義してまとめてコンパイルしたい場合はC-c C-kがいいです。あと、同じ関数名で定義してしまいエラーとなったらREPLでloadしなおしてください。

それとコメントの定義でこんなことがかかれてました。 最後に、今日学んだことのメモ

投稿者 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上で行います。基本的な流れとしては
  1. M-x slimeでREPL(対話式のLispバッファ)を起動
  2. 直接REPLでLispを実行するか、別バッファでLispファイルを編集しコンパイルしてからREPLで評価
となります。さすがにバッファの切り替えとかは各自で調べてください。 でもって最後に今日知ったコマンド。

screen_080924_01.png

screen_080924_02.png

ついでになんとなく画面写真を載せてみる

投稿者 mak : 05:07 | コメント (0) | トラックバック