Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2007-10-15

StumpWM

| 23:54 | StumpWM - わだばLisperになる を含むブックマーク はてなブックマーク - StumpWM - わだばLisperになる

del.icio.usのLispタグからStumpWMの紹介のムービーが流れてきたのでチェック。

The StumpWM Experience : male : Free Download, Borrow, and Streaming : Internet Archive

StumpWMはCommon Lispで書かれたウィンドウマネージャーということで、前から興味はあったのですが、この動画を観ると思いのほか使えそうなので、インストールしてみることにしました。

最初、asdf-install可能だったので、cmuclで試してみましたが、どうやら、登録されているのは古めで、試すなら、最新の方が良さそうだったので、READMEを参照しつつ再度sbclで試してみることにしました。

以下、Ubuntu 7.04 + SBCL 1.0.10 + Git版StumpWMで試しています。

StumpWMのソースの取得

$ git clone git://git.savannah.nongnu.org/stumpwm.git

で取得します。

ASDFで導入できるようにする。

ダウンロードしたものの中にstumpwm.asdがあるので、asdf::*central-registry*に登録されているパスにリンクを張ります。

専用イメージの作成

別にイメージを作成しなくても良いとは思うのですが、起動が少し速いのでイメージを作成してみることにします。cl-ppcreとclxに依存しているので、それも読み込みます。

;; make-stumpwm-core.lisp
;;
;; cd $coredir 
;; sbcl --load make-stumpwm-core.lisp

(require :asdf)
(asdf:oos 'asdf:load-op :clx)
(asdf:oos 'asdf:load-op :cl-ppcre)
(asdf:oos 'asdf:load-op :stumpwm)
(save-lisp-and-die "stumpwm-sbcl.core" :purify t)

のようなファイルを作成し、

$ sbcl --load make-stumpwm-core.lisp

を実行して、イメージを作成しました。

ウィンドウマネージャーの起動

色々方法はあると思うのですが、自分は、最初に古いstumpwmを試してしまったということもありスクリプトを色々作って対応しました。

最新だと色々準備されている様子なので、そっちを使った方が良いとは思います。

#!/bin/sh

sbcl --core ~/cl/stumpwm-sbcl.core --load ~/cl/stumpwm-sbcl.lisp
;; STUMPWM - stumpwm-sbcl.lisp
;; ================================================================
(stumpwm:stumpwm)
(cl-user::quit)

のような、stumpwmというシェルスクリプトと起動で読み込ませるファイルを作成し、

~/.xsessionに

#!/bin/sh

#~色々環境設定記述~

$HOME/bin/stumpwm

のように記述し起動させることにしました。

カスタマイズ

環境設定は、.stumpwmrcで設定します。サンプルが付いているので、それを参照しつつ設定という感じです。

使ってみる

使ってみた感じとしては、GNU Screenのウィンドウマネージャー版みたいな感じです。

初期設定では、Control-tがプレフィックスキーになっていて、そのあとにコマンドを入力します。

C-t :で式を評価できたりします。

詳細なドキュメントはないので、サンプルの初期化ファイルと、ソースを読んで、使い方を探るという感じです。

ウィンドウマネージャーの終了方法

とりあえず、どうやって終了するのか分からないので、式評価のプロンプトに(cl-user::quit)として終了させています。

まとめ

とりあえず、Common Lispで色々できるというところと、ムービーでは結構便利そうに使っていたので、しばらく常用してみたいと思います。

Paul Graham氏のユーティリティ その4

| 01:58 | Paul Graham氏のユーティリティ その4 - わだばLisperになる を含むブックマーク はてなブックマーク - Paul Graham氏のユーティリティ その4 - わだばLisperになる

PG氏のユーティリティを読んでみることの4回目。

引き続き繰り返し系(do系)のユーティリティ編です。

Lisp utilities that were not included in On Lisp or ANSI Common Lisp

お題

do-cyclic

暗記で再現

(defmacro do-cyclic (parms source &body body)
  (with-gensyms (g)
    `(let ((,g ,source))
       (case (length ,g)
	 (0 nil)
	 (1 (let ((,(first parms) (first ,g))
		  (,(second parms) (first ,g))
		  (,(third parms) (first ,g)))
	      ,@body))
	 (2 (let ((,(first parms) (second ,g))
		  (,(second parms) (first ,g))
		  (,(third parms) (second ,g)))
	      ,@body)
	    (let ((,(first parms) (first ,g))
		  (,(second parms) (second ,g))
		  (,(third parms) (first ,g)))
	      ,@body))
	 (otherwise 
	  (do-tuples/c ,parms (rotlist ,g)
	    ,@body))))))

とりあえずできた。ややこしい。そして、使い道が良く分からない。

rotlistは、このutx.lisp内で、do-tuples/cはonlispで定義されている。

動作
(do-cyclic (x y z) '(a b c d e f g h i j k)
  (print `(,x ,y ,z)))
=>
(K A B) 
(A B C) 
(B C D) 
(C D E) 
(D E F) 
(E F G) 
(F G H) 
(G H I) 
(H I J) 
(I J K) 
(J K A) 

お題

(defmacro do-plist (v1 v2 plist &rest body)
  (with-gensyms (rec rest pl)
    `(labels ((,rec (,v1 ,v2 ,rest)
                 ,@body
                 (when ,rest
                   (,rec (car ,rest) (cadr ,rest) (cddr ,rest)))))
       (let ((,pl ,plist))
         (when (consp ,pl)
           (,rec (car ,pl) (cadr ,pl) (cddr ,pl)))))))

暗記で再現:失敗

(defmacro do-plist (v1 v2 plist &body body)
  (with-gensyms (rec rest pl)
    `(labels ((,rec (,v1 ,v2 ,rest)
		(when ,rest
		  ,@body ;ここではない
		  (,rec ,(car rest) ,(cadr rest) ,(cddr rest)))))
       (let ((,pl ,plist)) 
	 (,rec ,(car pl) ,(cadr pl) ,(caddr pl)))))) ;consかどうかの判定を抜かした。
;; 動作
(do-plist i j '(a 1 b 2 c 3 d 4)
  (setf (get 'foo i) j))

(do-plist i j '(a 1 b 2 c 3 d 4)
  (print (get 'foo i)))
=>
1 
2 
3 
4 

動かしてみれば、そんなに難しいものでもなかったけれど、plistの構造が良く分かってないせいで上手く把握できてなくて、途中で何だか良く分からなくなって間違えてしまった。

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20071015