Shiro:LandOfLisp
Land of Lisp
書誌情報
Land of Lisp
Conrad Barski M.D.著、川合史朗訳
オライリー・ジャパン
ISBN978-4-87311-587-0
正誤
初版第1刷
- p.110下から1/4くらい
- 誤: ただ、mapの方が速いというだけだ。
- 正: ただ、mapcの方が速いというだけだ。
初版第2刷
- p.69 7行目
- 誤:
object-at
を実際に動かしてみよう - 正:
objects-at
を実際に動かしてみよう
- 誤:
- p.69 下から6行目
- 誤:
object-at
関数を使って見つけ、 - 正:
objects-at
関数を使って見つけ、
- 誤:
- p.115
dot->png
のコード。書籍版のままでも動作しますが、生成されるdotファイルの名前が本文中の説明と食い違います。原書サポートページからダウンロードできるコードだと本文の説明と合致します。違いは3行目。(defun dot->png (fname thunk) (with-open-file (*standard-output* (concatenate 'string fname ".dot") :direction :output :if-exists :supersede) (funcall thunk)) (ext:shell (concatenate 'string "dot -Tpng -O " fname ".dot")))
- p.131下から4パラグラフ目
- 誤: ノードを全てconnected関数を使って探し、
- 正: ノードを全てget-connected関数を使って探し、
- p.131下から3パラグラフ目
- 誤: リストが空になるまでfind-islandsを再帰的に呼んで
- 正: リストが空になるまでfind-islandを再帰的に呼んで
- p.133 上から4行め
- 誤: make-edge-listで作り、connect-edge-listで全てを接続する
- 正: make-edge-listで作り、connect-all-islandsで全てを接続する
- p.136下の方
- 誤: 単にノードにつながるエッジを(cdr (assoc n edges))で求め
- 正: 単にノードにつながるエッジを(cdr (assoc n edge-alist))で求め
- p.147 「配列」の見出しの次
- 誤: リストなく配列を使う
- 正: リストでなく配列を使う
- p.158 下から6行め
- 誤: これも、Lispにおける入力と出力の対象性の良い例だ。
- 正: これも、Lispにおける入力と出力の対称性の良い例だ。
- p.199中ほど
- 誤: 例えば0の向きの動物は、翌日には右上に移動する、
- 正: 例えば0の向きの動物は、翌日には左上に移動する、
- p.243中ほど
- 誤: Lispは文字列を直接操作できるのに、どういてわざわざ
- 正: Lispは文字列を直接操作できるのに、どうしてわざわざ
- p.249 下の方
- 誤: ソケットを開放してやらないと、
- 正: ソケットを解放してやらないと、
- p.262 中程
- 誤: 全て動いているおとが確認できたので
- 正: 全て動いていることが確認できたので
- p.305 15.3の見出しの次の行
- 誤: ゲームのコードは正常なる関数型
- 正: ゲームのコードは清浄なる関数型
- p.320 announce-winner関数のアイコン
- 誤: Clean/Functional
- 正: Dirty/Imperative
- p.324 handle-computer関数のアイコン
- 誤: Dirty/Imperative
- 正: Clean/Functional
- p.324 play-vs-computer関数、5行目末尾の
<DIV>
をトル - p.329 「ゲーム木をメモ化する」の次
- 誤: メモ化にょり
- 正: メモ化により
- p.345 16.2節2行目
- 誤: 14章で説明したように
- 正: 15章で説明したように
- p.356 2行目
- 誤: SGV Web
- 正: SVG Web
- p.422 「AIの改良」見出しの次
- 誤: なったのサイコロ
- 正: なったサイコロ
- p.448 コード例2行め
- 誤:
(setf (gethash 'my-key (nth foo 1)) 77)
- 正:
(setf (gethash 'my-key (nth 1 foo)) 77)
- 誤:
初版第3刷
- p.57 3パラグラフ目
- 誤: 読者は再び、エレガントで対象的なコードによって
- 正: 読者は再び、エレガントで対照的なコードによって
- p.118
maplist
の例の下- 誤: 後に現れないかどうかを調べるとができるわけだ。
- 正: 後に現れないかどうかを調べることができるわけだ。
- p.140
mapcan関数
の節の2行め- 誤:
mapcan
は返されたリストを全てappend
したものを返す - 正:
mapcan
は返されたリストを全てつなぎ合わせたリストを返す
- 誤:
- p.159 下から4行め
- 誤: けれもボブが
- 正: けれどもボブが
- p.172
pick-monster
関数10行め- 誤:
"That monster is alread dead."
- 正:
"That monster is already dead."
- 誤:
- p.253 POSTリクエストのbody
- 誤:
userid=foo&password=supersecretpassword
- 正:
userid=foo&password=supersecretpassword
- 誤:
- p.259 「最後の仕上げのサーバ関数」の直前
- 誤:
read-sequence
使ってストリームから - 正:
read-sequence
を使ってストリームから
- 誤:
- p.395 2パラグラフ目
- 誤: その時点でもうそれ以上左側の枝を調べる必要が
- 正: その時点でもうそれ以上右側の枝を調べる必要が
- p.407 3パラグラフ目
- 誤: ようやく
draw-tile
関数を呼ぶ準備が整った。 - 正: ようやく
draw-tile-svg
関数を呼ぶ準備が整った。
- 誤: ようやく
- p.444
three-way-if
の定義の5行め- 誤:
(,val ,@c)
- 正:
((not ,val) ,@c)
- 誤:
- p.448 「解説」のパラグラフ
- 誤: このでは変数
foo
に - 正: ここでは変数
foo
に
- 誤: このでは変数
- p.466 「どうやってバグをやっつけるか」のパラグラフ
- 誤: 遅延言語では無限に大きな
- 正: 遅延評価言語では無限に大きな
初版第4刷
- p.147~p.148 二つの
defparameter
の結果- 誤:
#(NIL NIL NIL)
- 正:
X
- 誤:
- p.xxiiの上のイラスト
- 誤: クロマニヨン人が乗っている恐竜に"COBOL"が抜けている
初版第5刷
- p.18 下から2行め
- 誤:
lables
はflet
と似ているが、 - 正:
labels
はflet
と似ているが、
- 誤:
- p.49 最初の行(前ページからのコードの続き)
- 誤:
(save-file)))
- 正:
(save-file))
- 誤:
- p.57 3パラグラフ目
- 誤: 読者は再び、エレガントで対照的なコードによって
- 正: 読者は再び、エレガントで対称的なコードによって
- p.131 本文7行目
- 誤:
x
にない新しいノードを見つけたら、その度に探索済みノードにpush
コマンドでそれを追加する。 - 正: 探索済みでないノードを見つけたら、それを探索済みノードのリストに
push
コマンドで追加する。
- 誤:
- p.200 下から6行目
- 誤: 向きの初期値は0、つまり右上で
- 正: 向きの初期値は0、つまり左上で
- p.205 「シミュレーション世界の1日」見出しの直前の行
- 誤:
push
を使って*animal*
リストに追加し - 正:
push
を使って*animals*
リストに追加し
- 誤:
初版第6刷
- p.34 ビリーのせりふ
- 誤: CADDDDADDDDRにいる警備員はどうするのさ???
- 正: CADDDDADDDRにいる警備員はどうするのさ???
- p.261
hello-request-handler
のコード: 本文ではコードを簡略化するため、 本来出力すべきhttpのレスポンス行とrfc822ヘッダを省略している。 当時のブラウザはそれでも許容してくれていたようだが、最近のブラウザはレスポンスを厳密に 解釈して無効な応答としてしまうようだ。正しく動作させるコードは例えば次のとおり:(defun hello-request-handler (path header params) (if (equal path "greeting") (let ((name (assoc 'name params))) (if (not name) (format t "HTTP/1.1 200 OK~%~%<html><form>What is your name?<input name='name' /></form></html>") (format t "HTTP/1.1 200 OK~%~%<html>Nice to meet you, ~a!</html>" (cdr name)))) (format t "HTTP/1.1 404 Not Found~%~%Sorry... I don't know that page.")))
初版 第7刷
- p.195 Loopマクロ周期表のinとonの項目
- 誤: inとonが「同じ」とされている
- 正: 「同じ」の表記と矢印を消す (inはリストの各要素について、onはリストのコンスセルそのものについて繰り返すので「同じ」ではない。)
紹介、書評
- Land of Lisp - ぱたヘネ : 原書の紹介ですが、具体的にどんな内容なのか詳しいので買う前に中身を知りたい人はぜひ。本書はCLISPを使いますが、LispWorksで動かすtipsも。
- 404 Blog Not Found : (笑) - 書評 - Land of Lisp
コード
- http://landoflisp.com/source.html 原書サポートページのダウンロード可能なソースコード。但し少々不都合が残っていて、本の方に載ってるコードが新しい。いくつか覚えてるのをメモ。
- wumpus.lisp : 上の
Land of Lisp - ぱたヘネでnatsutanさんが書いているように、
find-empty-node
の実装が非常にナイーブで運が悪いと無限ループする。修正法もnatsutanさんが書かれている (訳注に入れとけば良かったかな) - svg.lisp : 原書で17章に出てくるsvgマクロにはwidth, height引数が無くて、19章で使うsvgマクロにはこれらの引数がついてる。原書の指示どおり17章のコードをセーブして19章でロードして使おうとするとエラーになる。ダウンロード可能なコードでは、19章のdice_of_doom_v3.lispでsvgマクロをあらためて定義している。訳書はsvgマクロのインタフェースを19章のものに統一してある。
- dice_of_doom_v3.lisp :
draw-board-svg
関数の内側のloopのdo節で、タイルにリンクをつけるかどうかの判断の時、ダウンロードコードの方は現在選択されているタイルをチェックしていない。そのため一度選択したタイルを再クリックしてキャンセルすることができない。書籍のコードリストでは直っている。
- wumpus.lisp : 上の
Land of Lisp - ぱたヘネでnatsutanさんが書いているように、
- Gauche:LandOfLisp: Gaucheに移植したもの。
処理系ごとの差異
1.2節(p.6)で「12章以前はどんなCommon Lisp処理系を使っても良い」とあるけれど、
7章p.115で処理系依存関数のext:shell
が使われていることが判明。
別処理系での代替コード、判明したものをここに貼っときます。
- Clozure CLの場合 ( redditのhagezaさんのポストより)
(defun dot->png (fname thunk) (with-open-file (standard-output fname :direction :output :if-exists :supersede) (funcall thunk)) (ccl:run-program "bash" '("-c" "/usr/bin/dot -Tpng") :input fname :if-output-exists :supersede :output (concatenate 'string fname ".png")))
saki (2013/02/25 03:47:17):
shiro (2013/02/25 06:11:12):
snufkon (2013/02/28 00:08:11):
shiro (2013/02/28 11:28:42):
snufkon (2013/03/01 10:24:49):
n (2013/03/02 14:46:16):
fu7mu4 (2013/03/03 07:29:26):
fu7mu4 (2013/03/03 07:43:11):
shiro (2013/03/03 08:00:49):
tsz (2013/03/03 12:47:11):
fu7mu4 (2013/03/03 15:43:11):
shiro (2013/03/04 01:28:32):
snufkon (2013/03/09 09:41:23):
shiro (2013/03/10 07:34:17):
fu7mu4 (2013/03/23 13:44:27):
shiro (2013/03/23 20:50:38):
peropero (2013/03/24 04:35:45):
peropero (2013/03/24 04:59:38):
peropero (2013/03/24 06:20:41):
ponkore (2013/03/24 13:21:59):
ponkore (2013/03/24 13:22:25):
fu7mu4 (2013/03/24 13:54:18):
shiro (2013/03/25 11:12:06):
ito (2013/04/08 04:53:54):
camel (2013/04/26 15:37:10):
aznn (2013/06/08 12:49:56):
shiro (2013/06/08 20:37:03):
amagi (2013/06/09 08:38:23):
aznn (2013/06/09 10:01:47):
amagi (2013/06/09 10:40:20):
hatsunetsu7 (2013/08/08 04:02:56):
shiro (2013/08/08 05:15:47):
kenji (2013/10/01 23:22:18):
kenji (2013/10/06 02:31:36):
shiro (2013/10/06 08:07:08):
taka (2013/10/31 10:28:50):
taka (2013/10/31 12:30:55):
hrk (2013/11/23 08:44:20):
lambda_sakura (2014/04/02 08:22:55):
shiro (2014/04/02 08:29:08):
daiki (2014/05/26 15:02:43):
shiro (2014/05/27 04:31:03):
shiro (2014/05/27 04:31:50):
aki426 (2014/06/20 12:11:45):
aki426 (2014/06/27 12:21:17):
aki426 (2014/07/09 06:04:19):
aki426 (2014/07/09 09:29:43):
shiro (2014/07/09 22:40:27):
daiki (2014/08/21 14:39:36):
shiro (2014/08/21 18:13:01):
shiro (2014/08/21 18:16:09):
daiki (2014/09/25 14:50:25):
daiki (2014/09/25 15:45:56):
usa (2016/01/28 14:15:35):
sto (2016/05/09 03:28:07):
shiro (2016/05/09 08:04:39):
non (2016/09/26 23:13:03):
shiro (2016/09/27 02:32:46):
kei (2016/11/05 03:06:58):
shiro (2016/11/05 03:28:15):
elect (2017/02/22 16:03:17):
elect (2017/02/22 17:30:21):
vel (2017/06/26 11:09:04):
LISP (2017/06/27 09:31:36):
shiro (2017/07/02 10:04:49):
vel (2017/11/05 13:54:08):