1read 100read
2012年07月プログラム243: 【入門】Common Lisp その9【質問よろず】 (630) TOP カテ一覧 スレ一覧 2ch元 削除依頼
【GUI】wxWidgets(旧wxWindows) その5【サイザー】 (496)
C言語なら俺に聞け(入門編)Part 109 (554)
【.NET】F#について語れ2【OCAML】 (339)
文字コード総合スレ part7 (921)
monazilla Part 6 (631)
Google App Engine for java (266)

【入門】Common Lisp その9【質問よろず】


1 :2012/03/05 〜 最終レス :2012/11/07
Lisp Schemeスレでは恥ずかしくて聞けないようなことを質問したり、
Lisp Schemeスレの話題は高度すぎて気後れする人が話しあったり。
それ以外でもCommon Lispについての話題なら歓迎します。
ま、ゆっくりやりましょう。
「いいものの本質は、いかなる時代においても変わらない」byパワーズ
■前スレ
【入門】Common Lisp その8【質問よろず】
http://toro.2ch.net/test/read.cgi/tech/1309940115/
■Wiki
http://wiki.fdiary.net/lisp/ (id:guest pass:cl)
http://cl.cddddr.org/
http://tips.lisp-users.org/common-lisp/

2 :
アセンブリとCommon Lispの関係は?

3 :
Common Lispでウェブアプリ書いてる人いる?

4 :
>>2
質問の内容が良く分からないけど、ネイティブコードにコンパイルする処理系なら、
内部でアセンブリ言語を中間形式として使ってたりするよ。SBCLとかCCLとか。
>>3
事例があるか、って話ならGoogleに買収されたITAが商売でやってたし、
日本でいるか、って話ならpaserveとかHunchentootとか使ってやってる人はいる。

5 :
ポール・グラハムおじさんを忘れちゃいけない

6 :
グラハムの話はウェブ黎明期の話だからな
今から新規にウェブアプリを開発するときにCommon lispを
使うのはかなりの冒険だろ

7 :
clackを忘れたら可哀そうだよー。
深町さん、はてなをLispに染めてくれんかな。

8 :
Lucid Common Lispはよくできていたな。

9 :
***でSTGを作りますが何か?:いで庵
http://www.usamimi.info/~ide/programe/stg_doc/index.html
common lispでGUIシューティング・ゲームを動かすみたい
land of lispはCUI上のゲームだったっけ

10 :
>>9
これFFIなのかな
FFIで呼び出した先で落ちたりすると結構涙目なデバッグする羽目になることあると思うのだけど頑張ってほしいな

11 :
Lisp界隈の進歩が亀のようにノロい理由として、
すぐに俺実装を作りたがって開発リソースが分散しがちというのが
大きな理由としてあると思っている。例えば clojure-py を見ろ。

12 :
何度目だこれ

13 :
俺実装を作るってのもニーズの一つだから良いんよ。
あとスレチなんよ。

14 :
自分はcommon lispの初心者にPAIPやCLtL2など限られた書籍をまず読ませる、
とどなたかわかりませんが書いていた覚えがあるのですが、
ご存じの方はいらっしゃいますか?

15 :
CPUがi7の場合
並列実行できると高速になるはずなのですが
sbclはスレッドが不安定とも聞きます
i7で一番高速な処理系はどれになるのでしょうか

16 :
>>15 OSは?

17 :
>>15
>sbclはスレッドが不安定とも聞きます
ソースはどのあたり?

18 :
>>15
突っ込みどころは捨て置くとしても最速はFranzだと思うぞ
高いけど

19 :
OSはlinuxです
ソースは以前にいろいろブログみてまわってた時の印象です

20 :
1.0.54のリリースノートで
> We still don't consider threads on non-Linux platforms good enough to enable
> them by default, but they're in a clearly better shape now.
って書いてるし、Linux以外の環境ではあながち外してもないんじゃいか。
とはいえ、>>15のソースは別口だとは思うけど。
この所SBCLはリポジトリに動きがない。みんな忙しいんだろうか。

21 :
>>18
残念ながらAllegro CLはWindows以外ではネイティブスレッド非対応。
ユーザレベルスレッドだから、マルチコアでスケールしたりしないはず。
http://cl.cddddr.org/index.cgi?Allegro%20Common%20Lisp
http://common-lisp.net/~dlw/LispSurvey.html
http://www.franz.com/support/faq/#s-mp

22 :
>>21
Windows だけでってのは珍しいな。

23 :
androidでcommon lispを使った開発してる人
いますか?
ググってみたところecl,abcl、cclあたりが候補になるのかな?
 
あとsl4aというスクリプト実行環境を
利用する手もあるみたいです。
どれも敷居がたかそうだけど、lispで
android開発できたら素敵だなっと。


24 :
>>23
CommonLispでなくて良いならClojureがswank丸ごと動くのでSlime使って開発できたりするよ

25 :
数値を受け取り、
1桁なら0を10の位に挿入して文字列として、
そうでなければそのまま文字列として返す処理はどう書けばよいですか?
(defun num->string (i)
(if (<= 10 i)
(princ-to-string i)
(format nil "0~A" i)))
こう書いてみたのですが、princ-to-string と format が似たようなことをしているので
他の書き方は無いかと気になりました
princ-to-stringとformatのどちらかを書かずに同じ結果を取得できないものでしょうか

26 :
formatの書式指定で出来る。

27 :
~2,'0d

28 :
(format nil "~2,1,,'0@A" 1)
かな。

29 :
>>26-28
ありがとうございます。>>28でOKでした。

30 :
CLAZY: Lazy Calling in Common Lisp
http://common-lisp.net/project/clazy/
ここでthunkというものが出てくるのですが、なぜthunkというものを
使おうとするのでしょうか?

31 :
>>30
delayとforceが何をするものかを考えれば
簡易的な実現の一つとして、例えば
(defmacro delay (expr) `(lambda () ,expr))
(defun force (thunk) (funcall thunk))
というのもありだと分かるだろう。

32 :
http://en.wikipedia.org/wiki/Thunk_(functional_programming)
最初の方だけ読めばいいよ

33 :
>>31-32
ありがとうございます。理解できました。

34 :
(defun hoge ()
"
ここにコメントを書く
"
foo)
コメント部分に"とかを含めたい時ってどうやるんでしょ?
Pythonみたいに"""みたいなことって出来るんでしょうか?

35 :
評価されるならいくつか逃げ道思い付くけど、docstringは「not evaluated」だし、
\でエスケープするしかないんじゃなかったっけ。
奥義のリーダーマクロを使えばどうとでもなるとは思うけど。
CL-INTERPOLに望みの機能があった気が。
http://weitz.de/cl-interpol/

36 :
関数の途中で処理をstopさせたいのですが。
C言語のreturnのように、途中で処理を戻す方法はありますか?
(defun test-func ()
<中略>
(if flag
(message ”stop”)
(message ”continue”))
<中略>
)

37 :
>>36
(defun f ()
(dotimes (n 10)
(when (= n 5)
(return-from f))
(print n)))
多分、return-fromが期待してるものだと思う。
http://www.lispworks.com/documentation/HyperSpec/Body/s_ret_fr.htm
ただ、最近は、loop以外ではあまりreturn-fromって使わないと思う。

38 :
>>37
ありがとうございます。助かりました。

39 :
>>37
すいません。以下をEmacsの上で実行したのですが、
(defun temp (x) (if x (return-from temp 'dummy)) 44)
(temp nil) => 44 はうまく行くものの、
(temp t) のほうは、以下のようにエラーが出てしまいます。
Debugger entered--Lisp error: (no-catch --cl-block-temp-- dummy)
正常終了してくれると助かるのですが。

40 :
>>39
GNU Emacs Lispリファレンスマニュアル: Catch and Throw
http://www.geocities.co.jp/SiliconValley-Bay/9285/ELISP-JA/elisp_127.html
>Common Lispに関した注意: Common Lispを含むほとんどの他のLispには、
>非逐次的に制御を移す方法がいくつかある。
>たとえば、return、return-from、go。
>Emacs Lispにはthrowしかない。
common lispの関数がemacs lispにあるとは限らない一例だね

41 :
Lispでオブジェクト指向プログラミングをやるときのスタイルについて質問です。
CLOSでオブジェクト指向をやろうとすると、オブジェクトのスロットの値の変更が必要になったりしますが、
Lisper的には普通にsetfで代入してしまうのか、あるいは変更する度に新しいオブジェクトを作ってそれを渡したりするのでしょうか。
そもそも関数プログラミングとオブジェクト指向やクロージャって相容れないように思えます。

42 :
>>39
(require 'cl)
でreturn-fromを使えるようになるけれど、
elispのdefunはブロックを作らないので、
(defun temp (x)
(block temp
(if x
(return-from temp 'dummy))
44))
とするか、Common Lispのdefun互換のdefun*を使って
(defun* temp (x)
(if x
(return-from temp 'dummy))
44)
ここまで書いといてなんだけれど、elispに関してはこっちで
Emacs Lisp 3
http://toro.2ch.net/test/read.cgi/tech/1191875993/

43 :
>>40
>common lispの関数がemacs lispにあるとは限らない一例だね
あー、なるほど。
>>42
何から何まで親切にありがとうございました。

44 :
いいってことよ!

45 :
>>41
CLOSは普通に代入するスタイルですねー。
ただし、仰るような、関数的なオブジェクトシステムも存在します。
自分は以前Schemeで書かれたものをちらっと見掛けた程度ですが。
それと、OOPはさておき、クロージャは関数プログラミングでは不可欠な概念だと思います。
これがないと、例えばHaskellでもモナドのbindができなくて困るんじゃないでしょうか。

46 :
被るし、良く分からんのだけど、聞いた話の受け売りで。
>41
CLの基本データ構造はミュータブル。
racket,clojureはイミュータブル。
・・・らしい。
イミュータブル(純粋な関数型)とオブジェクトの話は、CLではあまり関係ないかも。
またイミュータブル中心でも、ocamlやscalaみたいに、直交させてるのもあるし、clojureみたいに別の方法で代用させたりしてるのもある。
クロージャーはウィキぺさんに書いてあるみたいに言語によって扱いが違うかも。
http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3
そして純粋な関数型でも、限定継続みたいな手法で、複雑な制御構造を復活させたりしてる。

47 :
>>41
例えば C++11 に導入される lambda 構文を見てみると、
実態はオブジェクトに過ぎない。
http://cpplover.blogspot.com/2009/12/lambda.html
クラス定義をちょろっと省略できるだけの構文糖だ。
C++ は GC を前提としていないので変数キャプチャのルールが少しばかり面倒だが、
要するにクロージャとオブジェクト (レコード) は抽象化の仕方が違うだけで
変数の束を閉じ込めるという意味では同じとも言える。
C++ で lambda が導入できるなら逆に Lisp でオブジェクト (レコード) とメソッドで
オブジェクト指向するのも別にアリじゃね?
クロージャとオブジェクトの関係を説明した面白い記事があるので紹介しておく。
http://www.ibm.com/developerworks/jp/opensource/library/itm-progevo3/index.html
http://www.ibm.com/developerworks/jp/opensource/library/itm-progevo4/index.html

48 :
CLじゃ、標準だから当たり前だけど、CLOSは普通に使われてるんだよね。
自作オブジェクト指向システムも良いかもしれないけど、
自作ライブラリには、もれなく自作オブジェクト指向システムも付いてくることになったら正直辟易

49 :
クロージャは評価される度に内部状態が変わるような例題のイメージが強かったので副作用必須かと思ってけど、実際はそうでもないのか

50 :
>>49
(let ((n 0))
(defun f ()
(print (incf n))))
とかのことですか?
この手のコードは、変数のエクステントが分かりやすいから良く例に使われますけど、
関数fに参照透明性がない(副作用がある)のは、単に破壊的変更のせいです。
(let ((n 0))
(lambda () n))
のような形でもクロージャは良く使われますが、この式が返す関数に副作用はありません。

51 :
>>50
流石に例が不親切だった気がするので、もう少し実際のコードに出てきそうな例を。
(defun x+-all (x l)
(mapcar (lambda (y) (+ x y)) l))
こんな感じで、レキシカル変数を参照することは多いです。

52 :
これくらいじゃないとクロージャーっぽくないと思う
(defun x+-all (x l)
(mapcar (lambda (y) (lambda () (+ x y))) l))

53 :
>>49
λ式の評価器に必要なのがクロージャですから。
funarg問題のために。

54 :
任意の数の引数を取る関数に、一個一個引数をつけるのではなく、
リストか何かでまとめて渡したいのですが、どう記述すれば良いですか?
(setq item1 '(item ”1”))
(setq item2 '(item ”2”))
(setq item3 '(item ”3”))
(widget-create 'radio-button-choice item1 item2 item3)
の代わりに、
以下のように記述したいのですが。
(setq itemList '(item1 item2 item3))
(widget-create 'radio-button-choice 'itemList);; //NG

55 :
apply?

56 :
>>55
applyとwidget-createの組み合わせだとうまく行きませんでした。
(apply 'widget-create 'radio-button-choice '(item1 item2 item3)) ;;NG
(widget-create 'radio-button-choice item1 item2 item3) ;;OK
以下だとうまく行ったのですが。
(defun seki3 (x y z) (interactive ”r”) (eval (* x y z)))
(apply 'seki3 '(2 3 4)) ;;OK
(apply 'seki3 2 '(3 4)) ;;OK
widget-create関数の使い方として以下を参考にしています。
なんとかリストで渡して選択画面を作りたいのですが。
http://www.dina.kvl.dk/~abraham/custom/widget.html#SEC16

57 :
>>56
Emacs Lisp 3
http://toro.2ch.net/test/read.cgi/tech/1191875993/
(setq itemList '(item1 item2 item3))
だと item1などが評価されない。
(setq itemList (list item1 item2 item3))
(apply 'widget-create 'radio-button-choice itemList)

58 :
>>57
できました。ありがとうございます。

59 :
ごく基本的に質問ですみません。
リストのn番目の要素の値を変更はどのように書けば良いのでしょうか?
たとえば、
(setq x '(”a” ”b” ”c” ”d”))
というリストがあった場合に、"c"の値を"C"と変更するにはどう書けば良いのでしょうか?

60 :
>>59
http://www.geocities.jp/m_hiroi/xyzzy_lisp/abclisp10.html#chap20
とか参照

61 :
>>60
ありがとうございます。

62 :
>>59
(setf (car x) "1") とか (setf (nth 2 x) "2") とか…
function ではなく accessor と分類されているオペレーターは setf と組み合わせて
破壊的操作に使用可能
詳細は以下の 5.1.1 と 5.1.2
http://www.lispworks.com/documentation/HyperSpec/Body/05_a.htm

63 :
emacsのslimeでcommon lispのソースを編集している際、
slime-eval-last-expressionで任意のs式を評価した結果(返り値)を
そのs式の直後に改行して結果を貼り付けることはできないでしょうか。
今はソースのs式をコピーしてslimeのreplで評価し、
その結果をソースに手作業で貼り付けおり、面倒です
たとえば(ceiling 1.1)とあるとき
(ceiling 1.1)
;; result: 2
;; result: -0.9
こういうふうに結果をs式の後に追記したいのですが、何か方法はありますか。

64 :
C-u M-x slime-last-expression

65 :
slime-eval-print-last-expression

66 :
間違えてageた上に遅れたorz

67 :
>>64-66
ありがとうございます。捗るようになりました。

68 :
M-x slime-scratch っていう手もある

69 :

CommonLispでclojureの -> みたいな関数ありましたでしょうか?

70 :
http://www.lispworks.com/documentation/HyperSpec/Front/X_Master.htm
で確認する。
もしくは、slimeで、 -> の上にカーソルを持っていき、M-x slime-hyperspec-lookup すると
ミニバッファに->が表示され、スペースや、リターンでは、[No match]になる。
つまり標準にはないということが分かる

71 :
>>69
同じような機能のものってことなら、CommonLispにはないんじゃないかな
Clojureのはメタ情報を活用してるから、同じ使い勝手のものを再現するのはなかなか難しいかも

72 :
Clojureの -> (arrow macro) を使うと
(list (int (Math/sqrt 25))) を (-> 25 Math/sqrt int list) と書けるのか

73 :
paipとpclを読み終わってcommon lispでたいていのことはできるようになったと思います
そこで質問しますが、common lispのスキルを上げるというかステップアップするには
どういうものに取り組めばよいでしょうか?
2,3年で廃れてしまうかもしれない流行に左右されるよりも、
10年20年先でも通用するような新しい試みが何かあれば知りたいです

74 :
単にCommon Lispの知識が得たいなら、リーダーマクロやコンパイラマクロ、
パッケージやCLOS、MOPなどの細かい機能について調べれば良いと思うけど、
そういうこと? あとはマクロの応用とか。好みから微妙に外してる気がするけど。
現在のLispの世界では、あまり先進的な言語機能って研究されてないと思う。
Common Lispは今進化が止まってるし。Schemeのhygienic macroくらい?

75 :
処理系の実装やハック。有名なソースの読解やオープンソースやブログでの公開。
他には計算機科学系の論文でも漁ってCommon Lispの機能で実装してみるとか?
数年先にどんな技術が通用するかなんて分からんよ。
それに言語は目的があって使うものだから、言語自体のスキルアップの意味が分からん。
先進的な機能はライブラリとして実装されるから、言語自体の進化には見えないだけ。

76 :
さっき思い付いたけど、限定継続とかは割とLisp方面でも積極的に研究されてる気がする。
元ネタはFilinskiの論文? まあこっちもSchemeなんだけども。
言語自体を深く知ってもあまり意味がないことには同感。
他の言語で基礎はもうできあがってて、単にCommon Lispに親しみたいのか、
言語の機能は把握したので、次にアルゴリズムやデータ構造を知っていきたいのか、
その辺も教えてもらえれば、みんなもっと適切な助言をしてくれるんじゃないかな。

77 :
73です 皆さんありがとうございます
>>74 処理系自体を改変することよりも、使い方を磨こうと思っています。うまく言えなくてすみません。
>>75
>先進的な機能はライブラリとして実装されるから、言語自体の進化には見えないだけ。
これは盲点でした。たしかにそうですね
そして、paipを読んで強く思ったのですが、
>>76さんのおっしゃるところのアルゴリズムやデータ構造が知りたい内容だとわかりました。
それらを体系的に(試しながら)勉強できる、(common)lispを使う教材があれば知りたいです。

78 :
ちょっと目標が遠大すぎる気もするし
まあこんなとこから始めて様子を見たらどうだろう
http://www.geocities.jp/m_hiroi/xyzzy_lisp.html

79 :
いまさらアルゴリズムやデータ構造を知りたいのはプログラム自体の初心者か。
言語毎の差異は小さいから、アルゴリズム系の本を買ってCommon Lispで実装すると良いよ。
逆引きCommon LispやCommon Lisp CookBookのコード例も参考になる。
あとは定評のあるソースをたくさん読んで、とにかく何か自前で書く。
どの言語でも入門がすんだ後の本はあまりない。他人のソースを参考に自前で書くのが一番。
あとOn Lispは必読。

80 :
限定継続の勉強ならSchemeのほうがいいんじゃないかな。
限定じゃない継続を使ってさくっと実装できるし。

81 :

>>70
>>71
無いですか。わかりました。ありがとうございました。


82 :
(setq allList '(("a" . ("a1" "a2" "a3")) ("b" . ("b1" "b2" "b3")) ("c" . ("c1" "c2" "c3"))))
上のような連想リストallListのなかの、"b"に対応する配列を差し替えたいのですが、
以下の(1)のように直書きするとうまく行くのですが、(2)のように(setf (nth 1 allList) '("b" . bList));と実行すると、
(3)以降を実行するのに、Wrong type argument: sequencep, bListとエラーが出ます。
どのように記述すればできますか?
(setf (nth 1 allList) '("b" . ("b01" "b02" "b03" "b04")));;(1)OK
(setq bList '("b01" "b02" "b03" "b04"))
(setf (nth 1 allList) '("b" . bList));;(2)NG
(setq myList (cdr (assoc "b" allList)));;(3)bの内容の表示
(setq i 0)
(while (< i (length myList))
(message (concat "myList(" (int-to-string i) "):" (nth i myList)))
(setq i (+ i 1)))

83 :
>>82
(assoc "b" allList :test #'equal)
http://www.lispworks.com/documentation/HyperSpec/Body/f_assocc.htm#assoc
http://www.lispworks.com/documentation/HyperSpec/Body/17_ba.htm

84 :
concatで怒られてるんじゃね?
'("b" . bList) だと bListが評価されないから (list "b" . bList)に置き換えてみ。

85 :
>>84
間違えたorz
(cons "b" bList) か。

86 :
>>83
ありがとうございます。
>(setf (nth 1 allList) '("b" . bList));;(2)
(2)のbListになにか符号をつけるなりして、(1)と同じかたちで読み込ませることはできるのでしょうか?

87 :
あ、ちょうどタイムリーに回答いただけました。試してみます。ありがとうございました。

88 :
herokuでsbclで動くのかな?
http://www.slideshare.net/mtraven/lisp-in-the-cloud

89 :
https://github.com/mtravers

90 :
>>88
buildpack使って書いたみたいね。
https://devcenter.heroku.com/articles/buildpacks

91 :
>>89
これはClozure CLベースで、それを元に作った
https://github.com/jsmpereira/heroku-buildpack-cl
がSBCLベースだな。

92 :
hunchentootについて教えて下さい。
複数のサブドメインを一つのサーバで扱おうと考えています。
cc.bb.com://AA/BB.html => cc.bb.com://cc/AA/BB.html
の様にしてサブドメインをディレクトリに変換したいのです。
hunchentoot:hostでドメイン名が取得出来る事は分かったのですが、
うまくフック出来ません。
(defmethod handle-request :before ((*acceptor* hunchentoot::acceptor)(*request* hunchentoot::request))...)
(defmethod hunchentoot:process-request :before ((*request* hunchentoot::acceptor))...)
共に全く引っかかりません。(一度も実行されないって事です)
あと、この変換後の値で通常のディスパッチをさせたいのですが、そのやり方も教えて頂けませんでしょうか。
ググってもうまくサンプルが見つけられません。HUNCHENTOOTのドキュメントは簡単過ぎて私には全く役に立ちません。
ちなみにLISPもCLOSもWEBアプリケーションも初心者ですんで見当外れな事を書いてるかもしれませんので
目的が達成出来るなら手法にはこだわりません。ヒントで構いませんのでお願いします。

93 :
Apacheやnginxをリバースプロキシに仕立てた方が楽な気がする。
コンテンツごとに別々のacceptor作って。

94 :
>>93
ありがとうございます。
それも検討してみます。Apacheなんかで受けて各々振り分ける形ですよね。
あとは全てのアクセスを引き取って自分でディスパッチャー実装しちゃうとかも考えています。
レンタルVPSなんでメモリーがタイトなんですよ。出来たら裏で重い処理を走らせたいし。
アクセスはほとんど無いんで勿体ないってのもあります。
やり方さえ分かれば数行で出来る処理だと思うんだけどいかんせん資料が見つからないんですよ。
全称関数に:beforeを付ければ処理に割り込めるってのはあってます?
hunchentootのソースコード読めば理解出来るものでしょうか?
googleコードサーチも終わっちゃったんで、サンプル探すのに
koders上でhunchentootで検索しても25(重複入れても59)件しか無いとかどうしましょう。
あと、PORT指定なんかしてたんで混乱してました。
http://cc.bb.com/AA/BB.html => http://cc.bb.com/cc/AA/BB.html
ですね。自分でも笑っちゃいます。

95 :
なるほど。じゃあ、hunchentoot:acceptor-dispatch-requestの特殊化は?
適当にacceptorを継承したクラスを作って、それ用のacceptor-dispatch-requestを定義して、
そのメソッドの中でrequestのホストを見て処理を分岐すれば良さそうな気がする。
acceptor.lispとかeasy-handlers.lispに書いてる既存の定義を見ればやり方は分かると思う。
流し読みなんで外してたらごめん。

96 :
hunchentoot-vhost.lispってのがある。

97 :
これか。
> (ql:system-apropos "vhost")
#<SYSTEM hunchentoot-vhost / hunchentoot-vhost-20110418-git / quicklisp 2012-03-07>

98 :
>>95
流石です。発想が柔軟ですね。
私の中ではまだどうもLISPとオブジェクト指向が繋がっていないんですよ。
コードまで参照して下さったのですか?
理屈の上ではそれで行けそうです。あとは私の努力次第ですかね。
ありがとうございます。
>>96
ありますね。これは用途的にはバッチリみたいなんですが
使い方が簡単には見つかりませんね。探してみます。
ソースは短いんですけど私には難しいです。
>>97
お陰様でQLでロードまでは出来ました。

99 :
>>98
サンプルコード書いたよー。
http://paste.lisp.org/display/128721
hunchentoot-vhostは~/quicklisp/dists/quicklisp/software/hunchentoot-vhost-20110418-gitに
READMEがあるので、そこに使い方書いてるよー。

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼
パR、パチスロの基盤のプログラム 2 (498)
【会津】パソコン甲子園2004【若松】 (780)
VBScriptについて必死に話し合うスレ (335)
OpenWatcom C++ (738)
JAVAってこんなことも出来ないの? (473)
iPhone iPad iOSプログラミング Part1 (553)
--log9.info------------------
日本女性歌手美人格付 (731)
いきものがかりのナマズみたいな顔の女の子 2匹目 (783)
◆globeのKEIKOが衰退し崩壊している件◆part1 (234)
なぜ本当に歌が上手い人がチャートの上位に来ないのか? (504)
     草野マサムネ氏でも叩くか        (453)
宮田繁男(元オリジナル・ラヴ) (451)
glaytakuro・part124 (317)
吉田拓郎ってさ名曲多いよな? (955)
ポルノ、最高の曲を主張し合うスレ (474)
ラルクの作品になりきって会話するスレ (556)
【大阪】ロックロックこんにちは!4【仙台】 (608)
☆★☆歴代最強のガールズバンドランキング☆★☆ (598)
秋元康は史上最低の作詞家 (339)
AZUKI is as great a poemer as ever lived (789)
アンチチャットモンチー part3 (445)
「邦楽ロック=ロキノン系」という風潮 (657)
--log55.com------------------
★2ch.scは何故失敗したのか
★クロール批判要望スレ
★削ジェンヌに文句ある人集合
★迷惑行為報告担当 - 小さな親切募集中 2
★2ch.scへの要望スレ Part3
★かっこう観測所
★スレ立て人キャップ
★2ch.scニュース系板観測所