2009年6月30日火曜日

【フムフム本】16章 さまざまなデータ構造


* 16章 さまざまなデータ構造
- 特になし。
** 16.1 ベクタ
- 特になし。
*** 16.1.1 ベクタの由来
- うお。ベクタリテラル、クォートが必要なんだ。。。
なんでだろう。Schemeだから、合理的な理由があるん
だろうけど、思いつかない。ちなみにCommon Lispで
は不要。単なるsharpsign macro。
*** 16.1.2 アクセスと代入
- vectore-refをplaceにしてset!がちゃんと動いた。
gosh> (set! (vector-ref v 0) 100)
#<undef>
gosh> (vector-ref v 0)
100
gosh>
*** 16.1.3 ユニフォームベクタ
- 特になし。
** 16.2 ハッシュテーブルとツリーマップ
- ツリーマップはCommon Lisp標準ではないような。楽
しみ。
*** 16.2.1 ハッシュテーブルの作成
- ハッシュテーブルをつくるときの

gosh> (define table2 (make-hash-table 'string=?))

にて、string=?をquoteしてるのはなんでだろう?
手続きを渡すという意味ではいらんだろう。
やってみる。

gosh> (define table3 (make-hash-table string=?))
*** ERROR: unsupported hash type: #<subr string=?>
Stack Trace:
_______________________________________
0 (make-hash-table string=?)
At line 59 of "(stdin)"
gosh>
なるほど。シンボルからhash typeを特定するという
機構を内蔵しているからなんだろうな。
*** 16.2.2 データの登録と削除
- hash-table-push!。なるほどハッシュの個々の値は
スタックになっているのか。これはこれで便利かも。
*** 16.2.3 その他のアクセス手続き
- hash-table...。これらは総称関数を利用していない
ので、名前が冗長。elispやってるときはそんなに気
にならないんだけど、Schemeでは気になるな。
*** 16.2.4 ツリーマップ
- なるほどこれはこれで便利。Common Lisp標準にはな
かったはず。
** 16.3 ストリーム
- 遅延評価は、可能無限の実装なんだな。
- 特になし。

こつこつ。

【フムフム本】15章 テキストの構築


* 15章 テキストの構築
- 特になし。
** 15.1 木を用いたテキストの表現
- 特になし。
** 15.2 text.html-lite
- 実践Common Lispにもでてきたけど、S式にしちゃう
とHTML生成は楽だなぁ。
- あれ?Gaucheでは、ユーザがREPLで手続きを定義し
て、同名の手続きがあるモジュールをuseした場合、
もとのユーザ定義がイキになる?
** 15.3 SXML
*** 15.3.1 *TOP*要素
*** 15.3.2 *PI*要素
*** 15.3.3 XMLルート要素
*** 15.3.4 属性の表現
*** 15.3.5 SXMLの要素の記述
*** 15.3.6 SXMLからXMLを出力する。
*** 15.3.7 SXMLを扱う便利なモジュール
- 特になし。

こつこつ。

【フムフム本】14章 入出力


* 14章 入出力
** 14.1 入力
*** 14.1.1 read
- Gaucheにはreadがある。
*** 14.1.2 その他の入力手続き
- 特になし。
** 14.2 出力
- 特になし。
*** 14.2.1 オブジェクトの外部表現の出力
- 特になし。
*** 14.2.2 人が読むための出力
- format。~{~}とかはなさそうだ。
** 14.3 ポート
- 特になし。
*** 14.3.1 ファイルポート
- 特になし。
*** 14.3.2 文字列ポート
- 特になし。
- 練習問題
これは後程やろう。
*** 14.3.3 現在のポート
- current-input-port。Gaucheでは手続きでアクセス
するんだな。Common Lispではspecial変数にbindし
ている。
*** コラム 動的環境
- Gauche(またはScheme)のwith-input-from-portの実
装にもよるが、それを動的「環境」とまで呼ぶもの
なのかなぁ。つまり動的な振舞だけだとしたら、そ
れを環境と呼ぶべきかどうか、ということ。
- x: (accum n), o: (accum 5)
今までもいくつか誤植があったが、ここは初学者に
は痛いかも。
- 動的、ということを自分がちゃんと理解していない
ので、ここの記述がいまひとつ飲み込めない。
*** 14.3.4 ポートの操作
- port-fold。なるほど、mapやfold的に考えるという
視点にたてば、いろいろな用語や概念がでてくる。
必要は発明の母、というのは相対的。
*** 14.3.5 その他のポート
- 特になし。

こつこつ。

【フムフム本】13章 文字と文字列の処理


* 13章 文字と文字列の処理
** 13.1 文字
- 特になし。
** 13.2 文字列の基本操作
- 「文字列は本来変更不可能であるべき」の「本来」が
気になる。なんだろう?
** 13.3 文字列の作成
*** 13.3.1 連結して作る
- 特になし。
*** 13.3.2 オブジェクトを文字列に変換する
- 特になし。
*** 13.3.3 文字列補間
- 文字列補間ってsharpsign dipatch reader macro的実
装なんだな。
- いまさらながらだが、Schemeのシンボルってcase
sensitiveなんだな。
gosh> (eq? 'hoge 'HOGE)
#f
*** 13.3.4 プログラムの出力を文字列として得る
- with-output-to-string。この引数がthunkという心
は、with-output-to-stringがマクロなので、引数
が評価されるまえにwith-output-to-stringの支配下
に入るということでいいのかな。
** 13.4 文字列の操作
- 特になし。
*** 13.4.1 リストへの変換
- 特になし。
*** 13.4.2 文字コードの変換
- 特になし。
*** 13.4.3 文字列の分割と統合
- 特になし。
*** 13.4.4 文字列の比較
- 特になし。
** 13.5 文字集合
- 文字集合を表すオブジェクト、なるほど。文字集合
をオブジェクトとして捉えるところがおもしろい。
*** 13.5.1 文字集合についての述語
- 特になし。
*** 13.5.2 文字集合の用途
- 特になし。
*** 13.5.3 その他の文字集合手続き
- 特になし。
** 13.6 正規表現
- object-apply。これは秀逸なアイデアだな。。。
object-applyをCommon Lispでやるとなると結構大変
なような? 本質的にはevaluatorをいじるべきだから。
通常の括弧を別キャラクタに逃がした上で、
reader-macorで( -> (object-applyとしてやればい
けるかも。すべてdispatchすることになっちゃうけ
ど。
- うーん。object-apply、#/.../リテラル、regmatch
オブジェクトの連携がとてもきれい。

期せずして、Shibuya.lisp TT3までにはSchemeも楽しめるようになっているかもしれない。

こつこつ。

2009年6月29日月曜日

【フムフム本】12章 数値


* 12章 数値
** 12.1 数の表現
- お、定数としてのπは組み込みでは無いんだな。
** 12.2 数値についての述語
- class-of。Gaucheは、classに統一されていてtypeが
無いのかも? 先々分かるだろう。
** 12.3 正確数と不正確数
- 特になし。
** 12.4 桁の丸め
- 特になし。
** 12.5 数値の比較
- 特になし。
** 12.6 四則演算
- 特になし。
** 12.7 最大、最小
- 特になし。
** 12.8 超越関数
- 特になし。
** 12.9 平方根、乗数
- 特になし。
** 12.10 文字列変換と数値変換
- x->number。変換できないときは0というのは大丈夫
なのか。
** コラム 総称関数であることを確かめる
- 特になし。

こつこつ。

【フムフム本】11章 評価モデル


* 11章 評価モデル
** 11.1 置き換えモデル
*** 11.1.1 作用順序評価
*** 11.1.2 副作用
** 11.2 環境フレームモデル
- この章、特になし。
- レキシカルオンリーならモデルの理解は簡単。

ここで基礎をやって、これからいろいろ増していくのだろう。

こつこつ。

【フムフム本】10章 テストと例外処理


* 10章 テストと例外処理
** 10.1 gauche.testモジュール
- 同じファイルに書いちゃうのが好み。Common Lispだ
と#+testとかつかったり。
- あとREPLから呼ぶ方が好み。shellからを紹介するの
は、スクリプト言語としてのGaucheの側面を強調し
ているのだろうか。
*** 10.1.2 比較手続き
- 特になし。
*** 10.1.3 まとめてテスト
- おお、makeに行くのか。
*** 10.1.4 テストのパラメタライズ
- 特になし。
** 10.2 例外処理
- 特になし。
*** 10.2.1 例外の捕捉
- そうか、Gauche(SRFI-34?)のcondition systemには
restartは無いようだ。
*** 10.2.2 例外を発生させる
- 特になし。
** 10.3 テストレームワークを書いてみる
- thunkってこういう風に使うんだ。勉強になるなぁ。

こつこつ。

【フムフム本】9章 状態の管理


* 9章 状態の管理
** 9.1 集合
- お、Schemeには大域変数の考え方があるんだな。
- Common Lispではspecial宣言されたdynamic
variablesの名前を*...*とするのが慣習。
- う、SRFI-1のmember、keywordを使ってないのでいち
いち引数の並びを覚えなければいかん。
- 練習問題
この問題難しい。。。時間ができたときにやる。

- 練習問題をやるなかで、Gaucheでdocstringが無いこ
とやlambda-listの仕様が環境にて表示されないのが
不便に感じた。
** コラム ベンチマークを取ってみる
- 特になし。
** 9.2 連想リスト
- 特になし。
** 9.3 手続きによるパターンの抽象化
- 特になし。
** 9.4 連想リストふたたび
- 特になし。
** 9.5 名前つきlet
- 特になし。
** 9.6 リストの変更と一般化set!
- set!はplaceに使えるんだ。
** コラム リテラルデータの破壊に注意
- Schemeでは'(1 2)がリテラルであり、immutableなん
だな。Common Lisp とは違うなぁ。そもそもCommon
Lispはreaderが前面に出ているからか、リテラルとい
う概念はあまり使わないが。
** 9.7 準クォート
- 特になし。
** 9.8 グラフ
- ちょこっとだけ。
** 9.9 具象と抽象の往復
- コード書きながら考えたり気づきがあるときと、頭の
中でこねくりまわしたり、図に書いたり、人にはなし
たりという中で考えたり気づきがあったりすることが
あるわけで、それらをどうmingleするかが、人となり、
な気がする。

こつこつ。

【フムフム本】8章 真偽値と条件判断


* 8章 真偽値と条件判断
** 8.1 述語と等価述語
- 特になし。
** 8.2 等価性
- 特になし。
*** 8.2.1 内容が同じ
- equal?はCommon Lispのequalpと同じかんじ。
*** 8.2.2 入れ物が同じ
- あ、Schemeにもシンボルという概念はあるんだ。
- eq?はCommon Lispのeqと同じかんじ。
- eqv?はeql的かな。
*** 8.2.3 数値として同じ
- 特になし。
*** 8.2.4 その他の等価性
- 特になし。
- SRFIまで含めると、Schemeも潤沢だ。
*** コラム 共有構造を持つリストの表記
- 特になし。
*** 8.2.5 等価述語をとる手続き
- 特になし。
*** 8.3 真偽値を扱う手続き
- 特になし。
*** 8.3.1 等価述語以外の述語
- 特になし。
*** 8.3.2 否定
- 特になし。
*** 8.3.3 述語を取る手続き
- 特になし。
- 練習問題
(define (my-every-pred . preds)
(lambda x
(fold (lambda (a b) (and a b)) #t
(map (lambda (pred) (apply pred x))
preds))))
(define (my-any-pred . preds)
(lambda x
(fold (lambda (a b) (or a b)) #f
(map (lambda (pred) (apply pred x))
preds))))
** 8.4 条件判断
- 特になし。
*** 8.4.1 ifとcond
- beginはprognと同じようなもの。
- おお。condで条件式の値を後続式で使えるのか。
- さらに判断式まで。SRFI恐るべし。
*** 8.4.2 case
- 特になし。
*** 8.4.3 andとor
- 特になし。
*** 8.4.4 whenとunless
- 特になし。
*** 8.4.5 and-let*
- お、and-let*も便利。
*** コラム すべて式である
- 特になし。

ついつい、もう一章やってしまった。

こつこつ。

【フムフム本】7章 手続き


* 7章 手続き
** 7.1 手続きオブジェクト
** コラム lambdaの由来
- これは読んだ。
** 7.2 手続きを取る手続き
- 「Schemeがfor-eachを構文ではなく手続きとして提
供しているおかげで、このように他の手続きと組み
合わせてより高機能な手続きを作り出してゆくこと
ができるのです」納得。
- 練習問題
(for-each-numbers print '(1 2 #f 3 4 #t))

(define (for-each-numbers pred prlist)
(for-each pred (myfilter number? prlist)))

(map-numbers (lambda (x) (* x 2)) '(1 2 #f 3 4 #t))

(define (map-numbers pred prlist)
(map pred (myfilter number? prlist)))

((numbers-only map) (lambda (x) (* x 2)) '(1 2 #f 3 4 #t))

(define (numbers-only walker)
(lambda (fn prlist)
(walker fn
(myfilter number? prlist))))
** コラム for-eachとmapの引数の順序
- Shibuya.lisp#1のつっこみであったような。
** 7.3 ローカル変数
- letrecはCommon Lispのlabels的だが、letrecの方が
汎用的だ。
** 7.4 可変長引数を取る
- (define (func a b . c) ...)。Schemeの
lambda-listはパターンマッチング風味だ。
- 練習問題
(define (mylist . x)
x)
** コラム 構文の拡張とマクロ
- 特になし。
** 7.5 可変長引数を渡す
- あれ?P79の上のほうのappendはlengthを使っていな
いような。lengthが駄目だからこう書けってことな
のかな?
** 7.6 引数のパターンマッチング
- matchはやっぱり便利。PAIPのpat-matchは強力だが、
このmatchの方がhandyかも。
** コラム matchによる構文の分解
- なるほど。mit構文をネタに徐々にマクロに近づいて
いく。
** 7.7 省略可能引数とキーワード引数
- あ、Schemeにもキーワードってあるんだな(Gauche拡
張?)。ということはSymbolもあるんだっけ?
** 7.8 部分適用
- cut便利。構文糖衣、馬鹿にならないな。
** 7.9 多値
- 特になし。
*** 7.9.1 多値を受け取る
- receiveはCommon Lispのmulitiple-value-bindと同
じかな。
- let-values,let*-values便利。構文糖衣いいな。
SRFIってCommon Lispにも展開されているのかな。
*** 7.9.2 多値を返す
- Common Lispといっしょ。
** コラム 「Lisp脳」の謎に迫る - Schemeプログラマの発想
- listにしちゃえば自由自在、入出力は別途考える、と
いう感覚は常日頃あるけど、fizzbuzzはdoで書いちゃ
うかも。。。

おもしろいのでついついやりすぎた。
今日から業務なので、ちょっとずつにしなければ。

こつこつ。

2009年6月28日日曜日

【フムフム本】6章 リスト


* 6章 リスト
** 6.1 リストのふたつの顔
- 「クォートはあくまで「プログラムとして解釈される
箇所で、データであることを示す」」というのはうま
い説明だなぁ。
- Common Lisp的には、「quoteはspecial operatorであ
り、the evaluatorは、その引数を評価せずにそのま
ま(readerから渡されたform(lisp objects)のまま)を
値として返す」かな。
** 6.2 リストの基本操作
- お、
gosh> (cdr '())
*** ERROR: pair required, but got ()
Stack Trace:
_______________________________________
gosh>
なんと。
- 「空でないリストXに対して、(cons (car X) (cdr
X))は常に元のリストと同じになる」これは「同じ」
の定義によるのでは。
** コラム クォートとeval
- お、Gaucheにはevalがあるんだ。
** 6.3 リストの走査
- foldはCommon Lispのreduceみたいなもんかな。
- foldのいろんな活用、おもしろい。
** 6.4 foldの定義
- なんか、#'がいないと寂しい気持になる。
- #?=、便利。これもreader macroでCommon Lispに導
入したいなぁ。
** 6.5 簡単なリスト処理
- う、deep-copy-list、書いてみたけど同等に関する
述語がわからないのでテストできない。

(define (deep-copy-list lis)
(if (pair? lis)
(cons (deep-copy-list (car lis))
(deep-copy-list (cdr lis)))
lis))

- ()に慣れちゃったので[]は面倒。[]って初学者にど
れくらい有効なんだろう?
- うーん。再帰、久しぶりなので頭がぼけぼけ。
- 練習問題

gosh> (define (mylength lis)
(if (pair? lis)
(+ 1 (mylength (cdr lis)))
0))
mylength
gosh> (mylength '())
0
gosh> (mylength '(a))
1
gosh> (mylength '(a b))
2
gosh> (mylength '((a) (b c)))
2
gosh> (define (myfilter pred proper-list)
(cond
((null? proper-list) proper-list)
((pred (car proper-list))
(cons (car proper-list) (myfilter pred (cdr proper-list))))
(else (myfilter pred (cdr proper-list)))))
myfilter
gosh> (myfilter odd? '(1 2 3 4 5))
(1 3 5)
gosh> (myfilter odd? '())
()
gosh> (myfilter odd? '(1))
(1)
gosh> (myfilter odd? '(2))
()
gosh>

** 6.6 2種類の再帰
- う、末尾再帰をちゃんと理解していなかったことが
わかった。
** コラム なぜ配列でなく対で並びを表現するのか?
- 特になし。

こつこつ。

【フムフム本】5章 プログラムの書式


* 5章 プログラムの書式
** 5.1 スクリプト
- 特になし。
** 5.2 マルチバイト文字の利用
- 特になし。
** 5.3 コメント
- #;、便利だな。Common Lispでも、;のsharpsignは未
定義なので、簡易に実装できそう。
*** 5.3.1 コメント使い分けの慣習
- Common Lispと同じ。
** 5.4 空白
- 特になし。
** 5.5 名前と予約語
- Symbolが無いから、直接「名前」という用語になる
んだろうな。
** 5.6 モジュールを使う
- 脚注、「名前をインポートする」という概念はある
んだな。

こつこつ。

【フムフム本】4章 Gaucheの基礎練習


* 4章 Gaucheの基礎練習
** 4.1 インタラクティブな実行とREPL
- 「Schemeでは全てが式」なんだ。ここでの式は
expressionsのことかな。このあたりの考え方は、
Common Lispでは、forms (またはlisp forms)が対応
するかな。lisp forms -(evaluator)-> lisp
objects
- GaucheにはREPLがあるんだな。
** 4.1.1 リテラル
- 「そのリテラルの値そのものが式の値」というのは
初学者には難しいかも。リテラルの値って何?とい
う疑問が湧きそうな。後で説明するのかな。
- お、goshはrestartに対応してないのかも?

gosh> T\あ
*** ERROR: unbound variable: T
Stack Trace:
_______________________________________
gosh> *** ERROR: unbound variable: |\\あ|
Stack Trace:
_______________________________________

- goshのエラー出力の"***"がorg-modeとかぶる。。。
- 「外部表現」と「内部のデータ」というのがGauche
の用語。それぞれCommon Lispのstandard syntaxと
lisp objectsに対応するのかな。するとlisp forms
はどういう位置付けになるのかが興味深い。

** コラム 端末の文字コード設定
- 特になし。

** 4.1.2 手続き呼び出し
- Schemeでは手続き(procedure)という用語がある。
- 「Schemeには(他の言語における)演算子は無い。全
ては手続きであり同じ文法で呼び出します。」うむ
む、これはちょっと難しい。function、macro、
special operatorなどの総称が手続きということか
な。

** 4.2 Emacs
- gosh、起動がめちゃくちゃ速い。
- pareditは当面導入しないで、scheme-modeを使って
みる。

** コラム Gauche自身にコードを生成させる

- うむ?

gosh> (use srfi-1)
#<undef>
gosh> (map integer->char (iota 128))
...

というのはマクロの動機としては弱いのではないか。こ
れは普通の手続きでいいのでは。useまで含めると
Schemeではマクロじゃないと書けないのかな。

こつこつ。

【フムフム本】付録B Emacsの設定


* 付録B Emacsの設定
この付録Bに記載されているサンプルそのままで動いた。

こつこつ。

【フムフム本】付録A Gaucheインストール


* 付録A Gaucheインストール
** slib
slibはUbuntu8.10のものにした。
$ sudo aptitude install slib
/usr/share/slib/ に格納される。
** Gauche
Ubuntu8.10のGaucheは0.8.13なので、tar-ballの0.8.14
にすることにした。
HPからDL。
格納先はデフォルトの/usr/localとした。
$ ./configure --with-slib=/usr/share/slib
$ make
$ make check
$ sudo make install


こつこつ。

【フムフム本】3章 Gaucheの設計思想や誕生の背景


* 3章 Gaucheの設計思想や誕生の背景
** 3.1 Perlの影響
- 文字列補間はCommon Lispにも欲しい。
** コラム GaucheはなぜPerlの影響を受けているのか?
- 特になし。
** 3.2 Common Lispの影響
- packageの仕組みがなくて、キーワードをラベルにつ
かって言語仕様的に混乱しないのだろうか。興味深
い。
** コラム "The Right Thing"とGauche
- なるほど! もう一段読むと、Gaucheは"The Right
Thing"の考え方におけるThe left Thingにケアしてい
るってことか。

こつこつ。

【フムフム本】2章 Gaucheの特徴


* 2章 Gaucheの特徴
- 1章に記載されていたように、Gaucheというのは単な
るScheme処理系のことではなく、なんというか、もっ
と広いプログラミング環境なんだな。MOP/CLOSもあ
るし。
- 始めの方の章が短いと、進んでいる感が出て読みや
すい。書き手の気遣いなのかな。Halmosを思い出す。


こつこつ。

【フムフム本】1章 LispとScheme

org-modeのまんま。すいません。

* 1章 LispとScheme
** 1.1 Lispの起源
- 特になし。
** 1.2 S式と前置記法
- S式だけでなく前置記法をメタプログラミングの容易
さの源泉とするのか。なるほど。
** 1.3 Scheme
- 「手続き呼び出しは継続を伴った引数つきgotoであ
る」ということは、関数呼び出しの実装の低次元な
部分(パタヘネにあるような)では普通の話だと思う。
そういう話なのか別の話なのかは、読んでいくうち
にわかるかな。
** 1.4 Gauche
- 特になし。
** コラム Schemeのすごい点
- ここの書きぶりからすると、Common Lispよりも
Schemeの方が抽象構文木の側面が強いと予測できる。
Common LispではSymbolic Computationのイメージ(ま
たは方式)でプログラムを書くことが多いかな。

こつこつ。

Gaucheを勉強してみる

今の自分がやりきれるのかわからないがGaucheを勉強してみることにした。
というのは、どうもCommon Lispの理解をもう一段上げるにはやはりコンパイラやインタプリタの理解が基礎に必要だと思うのだが、そのための良書にSchemeで書かれたものが結構ありそうだからだ。そこで、

->プログラミングGauche
--> SICP
---> インタプリタやコンパイラ本 (Schemeベース) (これの他にCベースのもやる)
----> Common Lispの理解に再帰

とプランしてみた。
PAIP勉強会とかProcessing勉強会とかいろいろ忙しくはあるのだが、これはこれでスタックが深いので、早めに準備しておこうという算段だ。やりきれないかも。

2009年6月21日日曜日

最近の取組み

業務繁忙なのもあるのだが、ここのところブログを書いたりメールを書いたりと、コミュニケーションすることに困難がある。筆が重い。どうしてだろう。。。

自分なりのペースで勉強は続けているので近況を。

  • 5月半ばからプロジェクトマネージメント勉強会を開催。こちらは本職なので、WBS-EVMをごりごりと。
  • 5月末からPAIP勉強会を開催。6章まで完了。自分的には2周目なので、理解が深まってうれしい。
  • Processing勉強会を準備中(6月末開始予定)。準備にあたって、まずはLEARNING PROCESSINGを読了した。プログラミングのよい入門書だなぁ。

とりあえずやらなきゃ、ということで物理的に近い人で集ってやってみている。将来的には、もっと広く募ってやりたいなぁ。

こつこつ。