2009-03-01から1ヶ月間の記事一覧

ここらでひと息

もうすぐ9章がおわる。 章の見出しから判断すると、今後の話題で僕が一番興味を引かれるのは11、18、19章だなぁ。 11章はThe Little Schemerの10章と関連する話題のような気がする。 「プログラミングGauche」は、SICPを読むに当たってSchemeの初歩的なこと…

一般化set!、その2

確か、121ページまで終わってたはず。 9章6節、「リストの変更と一般化set!」の続き。 HPの取得と変更は、get-itemとadd-item!にならって、次のように書ける。 ;; HPの値を取得 (define get-hp (lambda (player) (cdr (assoc 'hp player)))) ;; HPの値を変更…

卒業

明日は卒業式。 今日は卒業生や修了生の送別会があった。 自分も大学でアカデミックな部分に関わらせてもらっているので、「お世話になった人」として招かれた。 先生方から学生さんたちへの送る言葉。 ...あの日の僕はどうだっただろう。

わかった!...かな?

id:yagiey:20090322:1237738147でpush!後に持ち物リストが更新されないことが理解できなかったけど、トラックバックもらって分かった。 id:SaitoAtsushi:20090323:1237790745 まず、例えば、持ち物がpotion、dagger、cookieだったら (assoc 'inventory playe…

add-item!

指定したプレイヤーの持ち物に、指定したアイテムを追加する手続きadd-item!。 答えを見ずに書いたら間違えた。 ;; アイテムを追加する (define add-item! (lambda (player item) (let ((items (cdr (assoc 'inventory player)))) (push! items item)))) 使…

has-item?

さて、9章6節の後半。 make-player(id:yagiey:20090314:1237041715)で作った値で大域変数*player*を束縛しといて、*player*をいろいろ変更していく。 まず、指定したプレイヤーが指定したアイテムを持っているかどうか調べるhas-item? (define has-item? (…

delete-1を名前付きletで書き直し

やってみた。 gosh> (use gauche.test) #<undef> gosh> (define delete-1 (lambda (elt lis . options) (let-optionals* options ((cmp-fn equal?)) (let loop ((lis lis)) (cond ((null? lis) lis) ((cmp-fn elt (car lis)) (cdr lis)) (else (let ((tail (loop (c</undef>…

再帰的思考

やっぱり、自分はまだ再帰的思考ができていないと思う。 9章1節のdelete-1が、自分で書いたやつと模範解答がだいぶ違うのを思い出したので、改めてヒントを読んで考えてたけど、まったく分からなかった。 それどころか、模範解答を読んでもすぐには理解でき…

リテラルデータの破壊に注意

9章5節のコラム「リテラルデータの破壊に注意」。 Schemeの仕様では、リテラルデータを変更することは許されていないそうだ。 gosh> (define *nums* '(1 2 3 4 5)) *nums* gosh> (set! (car *nums*) 0) ; やっちゃだめ。 #<undef> gosh> *nums* (0 2 3 4) ってやる</undef>…

pop!

push!があるならpop!もあるんじゃないかなと思ってやってみたら、やっぱりあった。 gosh> (define *nums* (list 1 2 3 4)) *nums* gosh> (pop! *nums*) 1 gosh> *nums* (2 3 4) gosh> (pop! (cdr *nums*)) 3 gosh> *nums* (2 4) popした値を返すのね。 popの…

一般化set!

9章6節。最近は1日1節にも満たないなぁ。 超スローペース。こりゃいかん。 id:yagiey:20090307:1236410958で登場したset!が再び登場。 set!は既に束縛されている名前を別のオブジェクトに束縛し直す手続き(?マクロ?よく分からんけど)だったけど、SRFI-17…

push!マクロ

9章1節で出てきたけど、ガン無視してた。 先頭に要素を追加したリストで名前を束縛し直す操作 gosh> (define *nums* (list 1 2 3 4)) *nums* gosh> *nums* (1 2 3 4) gosh> (set! *nums* (cons 0 *nums*)) (0 1 2 3 4) みたいなのはよくあることなので、push…

手続き?マクロ?

手続きとマクロの区別がつかなかったけど、最近見分ける方法に気づいた。 「気づいた」って、そうたいそうなことじゃないけど...。 gosh> car #<subr car> gosh> (lambda (x) x) #<closure #f> gosh> push! #<macro push!> たぶん、#以外が手続きなんだと思う。</macro></closure></subr>

名前付きlet、ふたたび。

名前付きletがなかなか腑に落ちないので、名前付きlet使って階乗計算(ローカル手続きで末尾再帰)やってみた。 gosh> (use srfi-1) #<undef> gosh> (define fact-named-let (lambda (n) (let f ((m n) (cont (lambda (_) _))) (if (= m 0) (cont 1) (f (- m 1) (la</undef>…

matchでのエラー処理

はい、まだまだ9章5節。 依然としてmake-playerは奇数個の引数を受け付けない。 「奇数個の引数に適用することを受け付けない」というのは無理だけど、せめてもう少しわかりやすいエラーメッセージを出したい。 ということで、matchで全てのパターンにマッチ…

名前付きlet

9章5節。名前つきlet。 今回はRPGを想定して、以下のようなプレイヤーの状態をを表す連想リストを規定してみる。 ((hp . 320) ; 体力 (mp . 66) ; 魔力 (position . #f) ; 現在位置 (inventory potion potion dagger cookie dagger) ; 持ち物 ) 「ポーション…

連想リストふたたび、ふたたび2

めっちゃ嘘ついてた。 ってか、それ以前に、has-item?(id:yagiey:20090307:1236410294)とdelete-item!(id:yagiey:20090307:1236410958)は使っちゃダメだよね。 だって*inventory*から消してしまうし。 連想リストふたたび、ふたたび 違ぁぁぁーう!! どう…

連想リストふたたび、ふたたび

まだ9章4節。 id:yagiey:20090310:1236690209のデータベースから、値を取り出すための手続きを作ってみる。 (define item-properties (lambda (item) (cond ((assoc item *item-database*) => cdr) (else '())))) (define item-property-get (lambda (action…

連想リストふたたび

9章4節。 連想リストをネストさせて簡易データベースを作ろう、と。 データベースとは、 データベース = ((アイテム1 . アイテム1の性質) (アイテム2 . アイテム2の性質) ・・・ (アイテムn . アイテムnの性質)) アイテムの性質 = ((属性1 . 値) (属性2 . 値…

手続きによるパターンの抽象化

9章3節。 id:yagiey:20090309:1236597268の最後で挙げた3つの手続きは、以下の共通部分を持つ。 (lambda (elt lis . optionals) (let-optionals* optionals ((cmp-fn equal?)) (define loop (lmabda (lis) (cond ((null? lis) ○○) ((cmp-fn elt (△△ lis)) (□…

連想リスト

9章2節、連想リスト。 キーと値のペアで保存しといて、キーを元に値にアクセスするアレ。 多くのスクリプト言語などにも、連想配列という形で実現されてたりするな。 Schemeではキーと値のペアをドット対で表現し、連想リストをドット対のリストとして表現す…

サポートページ

プログラミングGaucheのサポートページに模範解答があるじゃないっすか! delete-1の解答をみてみると、結構違うじゃーん。 >< 模範解答 (define (delete-1 elt lis . options) (let-optionals* options ((cmp-fn equal?)) (define (loop lis) (cond [(nul…

emacsのキーバインド

emacs使ってるけどemacsのキーバインドには全然慣れていない(というか知らない)。 これじゃemacs使ってる意味ないなー、ってことで、ここ数日は先日紹介したdrill-instructor.el(http://blog.livedoor.jp/k1LoW/archives/65055608.html)を使ってる。 取…

set!

既に束縛されている名前を、再び違うオブジェクトに束縛する手続き。 多くの手続き型言語でいう「代入」をやりたいときに使う。 gosh> (set! lambda 3.141592) 3.141592 gosh> lambda 3.141592 みたいな。 これやっちゃうと大変なことになるけどね! で、指…

9章1節の練習問題:delete-1

srfi-1のdeleteは等価述語を満たす要素を全部削除してしまうけど、見つけた1つ目だけ消す手続きdelete-1を定義してみると (define delete-1 (lambda (elt lis . optional) (let-optionals* optional ((cmp-fn equal?)) (define loop (lambda (lis) (cond ((n…

delete

gosh> (use srfi-1) #<undef> gosh> (define *p* (cons 1 2)) *p* gosh> (delete *p* (list *p* *p* (cons 1 2) *p* *p*)) () gosh> (delete *p* (list *p* *p* (cons 1 2) *p* *p*) eq?) ((1 . 2)) みたいな、第1引数を第2引数のリストから見つけて全部削除した残</undef>…

member

gosh> (member 'cookie *inventory*) (cokkie dagger) gosh> (member 'ration *inventory*) #f のように、第1引数を第2引数の中から探し、見つかった場合には見つけたものを含めた残りのリストを、見つからなかったら#fを返す。 つまり、ifなどの条件式に使…

9章はじめー

9章1節、集合。 うっはー! 代入が一般的ではないSchemeで、どうやって状態を扱うのかとても興味がある。 すべて式である なんて言っちゃってるけど、やっぱ代入しちゃうのね。 新出の手続きは以下。 member set! delete これらの手続きを使って、持ち物を表…

and-let*

8章4節、and-let*に関して。 条件式が#fじゃなければその値を使って計算して、その結果で真偽を判定して、#fならば処理を止め、#f以外ならばさらにその値を使って計算して...、みたいな場合、つまり int val1=0,val2=0,val3=0; if ((0 != (val1 = SomeFunc1(…

whenとunless

8章4節のwhenとunlessに関して。 when 与えた式が真となるとき(つまり#fにならないとき)に限り処理をする場合に使う。 (when <条件式> 複数のS式) を評価した後、それが#f以外になれば以降に続く「複数のS式」を順に評価して、最後のS式の値をwhen全体の値…