[image]
Land of Lisp
Conrad Barski M.D.著、川合史朗訳
オライリー・ジャパン
ISBN978-4-87311-587-0
object-atを実際に動かしてみよう
objects-atを実際に動かしてみよう
object-at関数を使って見つけ、
objects-at関数を使って見つけ、
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")))
<DIV>をトル
(setf (gethash 'my-key (nth foo 1)) 77)
(setf (gethash 'my-key (nth 1 foo)) 77)
maplistの例の下
mapcan関数 の節の2行め
mapcanは返されたリストを全てappendしたものを返す
mapcanは返されたリストを全てつなぎ合わせたリストを返す
pick-monster 関数10行め
"That monster is alread dead."
"That monster is already dead."
userid=foo&password=supersecretpassword
userid=foo&password=supersecretpassword
read-sequence使ってストリームから
read-sequenceを使ってストリームから
draw-tile関数を呼ぶ準備が整った。
draw-tile-svg関数を呼ぶ準備が整った。
three-way-if の定義の5行め
(,val ,@c)
((not ,val) ,@c)
fooに
fooに
defparameterの結果
#(NIL NIL NIL)
X
lablesはfletと似ているが、
labelsはfletと似ているが、
(save-file)))
(save-file))
xにない新しいノードを見つけたら、その度に探索済みノードにpushコマンドでそれを追加する。
pushコマンドで追加する。
pushを使って*animal*リストに追加し
pushを使って*animals*リストに追加し
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.")))
find-empty-nodeの実装が非常にナイーブで運が悪いと無限ループする。修正法もnatsutanさんが書かれている (訳注に入れとけば良かったかな)
draw-board-svg 関数の内側のloopのdo節で、タイルにリンクをつけるかどうかの判断の時、ダウンロードコードの方は現在選択されているタイルをチェックしていない。そのため一度選択したタイルを再クリックしてキャンセルすることができない。書籍のコードリストでは直っている。
1.2節(p.6)で「12章以前はどんなCommon Lisp処理系を使っても良い」とあるけれど、
7章p.115で処理系依存関数のext:shellが使われていることが判明。
別処理系での代替コード、判明したものをここに貼っときます。
(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")))
Past comment(s)
p.110 中段下: ただ、map の方が速い -> mapc のtypoでしょうか
ですね。
p.131 でタイポ2つ。
- ノードを全て connected 関数を使って --> ノードを全て get-connected 関数を使って
- リストが空になるまで find-islands を再帰的に --> リストが空になるまで find-island を再帰的に
ありがとうございます。実はちょっと予定が前倒しになりまして、2刷の原稿がもう印刷に回ってしまいました。3刷に反映させていだだきます (3刷があればいいな...)
直ぐに3刷になりそうですね。いくつか気づいたタイポを追加しておきます。
- p.136: エッジを (cdr (assoc n edges)) で求め --> エッジを (cdr (assoc n edge-alist)) で求め
- p.141: known-city.dot.png という新しい図 --> known-city.png という新しい図
- p.142: コード11行目、 "You ran into the Wumpus" は、他と合わせて "You ran into the Wumpus. Game Over." の方がいいかと思いました。
- p.243: Lisp は文字列を直接操作できるのに、どういてわざわざ --> Lisp は文字列を直接操作できるのに、どうしてわざわざ
p.199: 「例えば0の向きの動物は、翌日には右上に移動する」は「左上」の方が正しいのでしょうか
p.133: 「make-edge-listで作り、connect-edge-listで全てを接続する」→「make-edge-listで作り、connect-all-islandで全てを接続する」でしょうか?
p.132:ソースコード中の5行目、「lambda(x)」のxは使用されていないので、「lambda()」ではないでしょうか?
snufkonさん: 私の環境では図のファイル名はknown-city.dot.pngになります。dotプログラムの出力なので、graphvizのバージョンにより違いがあるのかな? うちのはv2.20.2です。あとゲームメッセージに関しては原書を尊重させて下さい。
fu7mu4さん: p.132のコード
(remove-if-not (lambda (x) (zerop (random *cop-odds*))) edge-list)ですが、remove-if-notに渡す関数は1つ引数を取らないとならないので、たとえ使ってなくても引数が必要です。
初版第1刷で、clean/dirtyのアイコンの誤りがありました。
p.320: announce-winnerのアイコンは原著ではdirty/impreativeです。 p.323: handle-computerはclean/functionalに見えます。原著でもdirtyですが...。
あとタイポも一つ見つけました。 p.329: 「メモ化にょり」 -> 「メモ化により」
p.147 9.1配列で、「リストなく配列を使う」→「リストではなく配列を使う」
handle-computerは原書も誤りのようですね。
私の使ってる graphviz のバージョンはv2.28.0でした。dot->png 関数がp115と原書サポートページ(http://landoflisp.com/graph-util.lisp)とで違っているのが原因かなと思いました。サポートページの方だとconcatenateで".dot"を付け加えているようです。自分は本に記載されているコードを打ち込みながら実行していたので".dot"をconcatenateするところが抜けてたようです。失礼しました。 タイポ追加報告しておきます。
- p.311: game-tree 関数は木構造の一つの枝に、 --> chgame-tree 関数は木構造の一つの節に、
- p.324: play-vs-computer のコード、5行目最後に"<DIV>"
- p.345: 14章で説明したように、 --> 15章で説明したように
- p.356: 最近 Google から SGV Web --> 最近 Google から SVG Web
- p.422: AI が、ゲームの重要な要素となったのサイコロを --> AI が、ゲームの重要な要素となったサイコロを
あああ、なるほど。手元のコードを実行してknown-city.dot.pngになったのでてっきりそういうものかと思い込んでしまいましたが、本のコードが違っていたのですね。これはできれば本のコードの方を直したいなあ。他のタイポ報告もありがとうございました。
P.254 のdecode-param関数コードの16行目のスペースが#\spaceは#\Spaceではないですか?
どちらでも同じです。直前のhttp-charで#\Spaceを使っているので不統一が気持ち悪いといえばそうなんですが。
第1刷 p.73 下のコード 3行目 objects-at -> object-at 同じページの本文 下から3行目も同じ objects-at -> object-at
第1刷 p.71 look関数の結果 1行目後半 OF A WIZARD'S HOUSE と、2行目前半 THERE IS は出力されないのでは? (p.60の *nodes* の定義、p.61の describe-location関数の定義より)
第1刷 p.71 look関数の結果 1行目後半 OF A WIZARD'S HOUSE と、2行目前半 THERE IS は出力されないのでは? (p.60の *nodes* の定義、p.61の describe-location関数の定義より)
第1刷を見てます。 P.249 予想外のコンディションからリソースを保護する 「ファイルハンドルやソケットを開放して」の「開放」は「解放」ではないでしょうか?
P.305 15.3 ダイス・オブ・ドゥームの実装、バージョン1 「ゲームのコードは正常なる関数型」の「正常」は「清浄」ではないでしょうか?
P.262 のWebサイトの立ち上げの最初の行ですが 「個々の機能が全て動いているおとが確認できたので」は「個々の機能が全て動いていることが確認できたので」のtypoですね。
snufkonさん: ゲーム木の説明では原書が特に枝と節を区別していなくて、ここでもbranchになっています。統一した方が良いといえばそうなのですが。
peroperoさん: これは
objects-atの方が正しいです。が、別の場所でobject-atと表記しているところがありました (原書にもある誤り)。また、p.71の出力はご指摘のとおりです。原書の著者が書いてる途中でコードを変更して、出力の方を直し忘れたのかな。
p.448 例 2: (setf (gethash 'my-key (nth foo 1)) 77)の (nth foo 1) は (nth 1 foo)
読者です。 'p158のLispにおける入力の対象性' の'対象性'は対称性でしょうか
3版、P.15で、正解が56の時に〜の実行方法が分からないのですが... 書籍の通りに(bigger)と実行しても以下のエラーが出てしまいます。 どうするのが良いのでしょうか?
- EVAL: undefined function SELF
The following restarts are available: USE-VALUE :R1 Input a value to be used instead of (FDEFINITION 'SELF). RETRY :R2 Retry STORE-VALUE :R3 Input a new value for (FDEFINITION 'SELF). ABORT :R4 Abort main loop
>aznnさん、setfをselfと打ち間違えていませんか。
3刷はどこで手に入れることができますか? とってもほしいんですけど、1刷りとか掴まされたら損した気分になりそうで・・・
>shiroさん 超ごめんなさい...。ありがとうございました。 初めたばかりで勝手が分からなくて...
>amagiさん オライリーのPDF版は3版でした。
>aznnさん ありがとうございます。 オライリーのサイトで買えばだいじょうぶかな・・・ 本も新しいのになっててくれればいいなー
楽しく読ませてもらっています。 第1刷 p253 12: userid=foo&password=supersecretpassword は 12: userid=foo&password=supersecretpassword ではないでしょうか?Content-Length: 39とありますし。
あっそうですね。POSTリクエストのbodyで&を置き換える必要はないですね。
学生時代以来のLispです。まだ9章の途中までしか読めていません。原書からのtypoのようですが、第1刷 p172のコードの10行目はalread → already ですかね。
今読み終わりました。非常に楽しませていただきました。どうもありがとうございます。先程の投稿が表示されないので、重複してしまうかもしれませんが、typoのお知らせです。 p407 draw-tile関数 → draw-tile-svg関数 p444 three-way-ifの実装が説明と食い違っている p448 解説の下の段落で このでは → ここでは p466 どうやってバグをやっつけるか の次の段落で 遅延言語 → 遅延評価言語
p444のthree-way-ifは 式がnilのとき → 式がtのとき だと思うのですが、如何でしょうか?
kenjiさん、ありがとうございます。上の正誤表に反映させました。three-way-ifは、多分原著でも「0とnilとそれ以外を区別したい」という意図だと思うので、コードの方を訂正します。
誤植と思われる箇所がありましたので失礼します. 第2刷 p.395 5行目 左の分岐 -> 右の分岐, 左側の枝 -> 右側の枝 あとコードの追加情報です. 原著サポートページのソースコードのdice_of_doom_v4.lispでp.421のweb-handle-humanが定義されておらず,handle-humanが定義されています.ブラウザ表示する場合には,p.421のweb-handle-humanを定義する必要があります. またp.259のserve関数を使う場合に,レスポンスヘッダを何か送らないとFirefoxではソースのまま表示されてしまうので注意が必要かと思います.
楽しい体験をありがとうございました.
すみません,投稿の記述に誤りがありました.
レスポンスヘッダは必要なく,レスポンス行だけで十分でした.
typoではないでしょうか? 第3刷 p. 57 第3段落1行目「対象的」→「対称的」
楽しく読ませて頂いてます。気になる箇所がありましたのでご報告させて頂きます。
第1刷 p.140 mapcan関数の説明の2行目 「mapcanは返されたリストをすべてappendしたものを返す。」 となっています。
実際はmapcanはnconcしますし、原著だと"should be appended together."となっているようですので誤訳ではありませんか?
正誤表に反映してあります>lambda_sakuraさん
すみません。 p.71 look の所で分からなくなりました 表示されないことと、2行目の魔法使いの館ってどういれたらいいでしょうか?
(look)を実行しても何も表示されないってことですか? ここは頻繁なやりとりには不向きなので、良ければ http://chaton.practical-scheme.net/gauche/ にお返事ください。
いや、http://chaton.practical-scheme.net/common-lisp-jp/ の方がいいかな。まあどちらでも良いです。
楽しく読ませていただいております。ところで脱字を見つけました。
3刷p.118第4パラグラフ 誤「調べるとができるわけだ。」 正「調べることができるわけだ。」 かと思います。次刷の修正にお役立て頂ければ。
3刷p.159下から4行目 誤「けれもボブが」 正「けれどもボブが」 かと思います。
3刷p.259中央あたり 誤「read-sequence使ってストリームから」 正「read-sequenceを使ってストリームから」かと思います。
すいません、上記3つの報告ですが、すべて第2刷でした。とんだ間違いをしていました。訂正させてください。
上の正誤表に載っていなければ3刷にも残ってると思います。後でまとめて反映しておきます。
すいません、気になったことがあります。p147、9章からdefparameterで名前をつけたところが中身が表記されています。
確かに。CLISPだとdefparameterは変数名を返しますね。
いや、CLISPが、じゃなくてdefparameter, defvarは変数名を返すように仕様で定められてるんだな。
すみません。また、気になったことがひとつ、p313 10:のインデントです。Gaucheでは、(notの下になってますが第2版だと(and の下になってます。
すみません、自分がメモ帳に写していって、閉じ括弧ばかり追っていったのでややこしくなってました。p313 10: 5文字、11:〜17: 6文字のスペースで落ち着きました。
第5刷購入しました。刷を重ねる毎に誤植が減っているようでありがたいです。 p.18下から二行目は「lables」は「labels」だと思います。
3刷p.131 p130の10行目の解説している部分「xにない新しいノードを見つけたら、」と書かれていますが、get-connected関数にxはない。おそらくvisitedが正しいです。
>sto ああ、そうですね。5刷にもまだ残ってます。ありがとうございます。
第5刷ですが、p.49最初の行 (save-file))) の')'は1つ多くないでしょうか。
Good catch! >non
第5刷のp.200・下から6行目「向きの初期値は 0 、つまり右上で」となっていますが「左上」ではないでしょうか。
ですね。
第5刷です。 P130のコード12行目、(traverse (cdr edge)) となっていますが、この定義では引数に取るものはリストではないと思うので、ここは(traverse (cadr edge))ではないでしょうか?
すみません、先程の質問ですが、どうやら問題なかったようですので撤回させて下さい
Land of Lisp第5刷です。p205 シミュレーション世界の1日 一行前 最後に...*animal*リストに追加し、-> 最後に...*animals*リストに追加し、 ではないでしょうか?
LIST is #1
そのとおりです >velさん
p57 第3段落1行目 「対照的」 -> 「対称的」だと思われます。(過去の指摘は合っているが訂正が間違っている。原文ではsymmetry)
8刷ですが,こちらがまだ繁栄されていないような
>yuki しまった、失念していた模様です。
いやまてよ、初版第6刷のところに挙げられてるfixですよね。正誤のところに挙げられてるものは伝えてあるはず(というか、ここを見て直してもらってるはず)ですが、確認してみます。
Post a comment