Learning Python

Apple - QuickTime - WWDC 2008 Keynote
http://events.apple.com.edgesuite.net/0806wdt546x/event/index.html
iTunes Store Podcast - WWDC 2008 Keynote Adress
http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?i=26717006&id=275834665

ちょっと遅れましたが、WWDC 2008 基調講演 (Podcast版) を iTunes でダウンロードして見ました。iPhone SDKにも挑戦しているので、iPhone はぜひ購入したいですね!

話は変わりますが、書籍

詳解 Objective-C 2.0

詳解 Objective-C 2.0

を購入しました。

以前、発売されていた

Objective-C Mac OS Xプログラミング

Objective-C Mac OS Xプログラミング

Objective‐C―MacOS Xプログラミング入門

Objective‐C―MacOS Xプログラミング入門

の2冊も持っています。

私は、以前説明されていた重複箇所は読んでいません。おおまかに

CHAPTER 6 ガーベジコレクション
CHAPTER 11 プロコトル
11-04 高速プロコトルと列挙子
CHAPTER 12 宣言プロパティとアクセサ

を読みました。特に11章の ‘高速列挙の実装例’ は大変参考になりました。基本的に

The Objective-C 2.0 Programming Language: Introduction to The Objective-C 2.0 Programming Language
http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/chapter_1_section_1.html

を読んで理解していることが正しいのか、確認に利用しました。日本語の資料は貴重なので、持っていて損しないと思います。

また、以前ブログ [ id:KYoshiaki:20080413 ] で書いたように

Practical Common Lisp (Books for Professionals by Professionals)

Practical Common Lisp (Books for Professionals by Professionals)

を読んでいる途中だったのですが、前々から Python に興味があったので、洋書

Learning Python

Learning Python

を購入してみました。Python に関しては

みんなのPython

みんなのPython

を読んだ知識しかありませんし、ほとんど忘れてしまいました。

Learning Python (asin:0596513984) は基本を学ぶには最適な本だと思います。

みんなのPython (asin:479733665X) では理解できなかった while 文の else の動作が理解できました。(他の言語では、あまり見かけない動作です。)

while :

if : break
if : continue
else:

の条件が False になり while ループから抜ける時に が実行されます。
が True で break した後 while ループを抜ける場合は は実行されません。

インタラクティブシェル (対話型シェル) を利用して、試すと

>>> x=5
>>> while x:
...     print x
...     x=x-1
... else:
...     print 'exit'
...
5
4
3
2
1
exit
>>> 
>>> x=5
>>> while x:
...     print x
...     x=x-1
...     if x==2: break
... else:
...     print 'exit'
...
5
4
3
>>>

のような動作になります。同様に for 文にも else があります。

また、何度も object reference、変更可能 (mutable)、変更不可能 (immutable) の違いを説明されます。

例えば、インタラクティブシェル (対話型シェル) を使って説明すると

>>> L = [1, 2]
>>> M = L
>>> L = L + [3, 4]
>>> L, M
([1, 2, 3, 4], [1, 2])
>>> 

ここで
L = L + [3, 4]
は、L = [1, 2] + [3, 4] となり、L に新しく作成したオブジェクト [1, 2, 3, 4] を割り当てています。
その結果
L = [1, 2, 3, 4]
M = [1, 2]
になります。

>>> L = [1, 2]
>>> M = L
>>> L += [3, 4]
>>> L, M
([1, 2, 3, 4], [1, 2, 3, 4])

この場合 L += [3, 4] は L、M が参照しているオブジェクトに [3, 4] を追加しているので L、Mの結果は同じ [1, 2, 3, 4] になります。下の append、extend を利用した例も同じ動作です。

>>> L = [1, 2]
>>> M = L
>>> L.append(3)
>>> L.append(4)
>>> L, M
([1, 2, 3, 4], [1, 2, 3, 4])
>>> L = [1, 2]
>>> M = L
>>> L.extend([3, 4])
>>> L, M
([1, 2, 3, 4], [1, 2, 3, 4])
>>> 

Learning Python (asin:0596513984) は暇を見つけて、こつこつ読んでいます。現在、420 ページほど読みました。Practical Common Lisp (asin:1590592395) は最後まで読んでいませんが、Learning Python (asin:0596513984]) は読破したいですね!

Wordbook2

以前、何度か紹介した Mac OS X Leopard 上で動作する自作フリーウェア ( 登録した単語を問題として出題できる単語帳プログラム。)

Wordbook2 [ http://kyoshiaki.sakura.ne.jp/osx/leopard.html ]

を公開します。Spotlight、Quick Look にも対応しています。ソースも含まれています。

Practical Common Lisp

NDA のため詳しくは書けませんが、最近 iPhone SDK に挑戦しています。まだ資料を読んでいるだけの段階ですが!何か作れたらいいなと思っています。

話は変わりますが、LISP 関連の書籍は今までに

入門Common Lisp―関数型4つの特徴とλ(ラムダ)計算

入門Common Lisp―関数型4つの特徴とλ(ラムダ)計算

On Lisp

On Lisp

の2冊購入しています。On Lisp は私にとっては難しすぎて、途中で読むのをやめてしまいました。基本的なところは 入門Common Lisp―関数型4つの特徴とλ(ラムダ)計算 で勉強したのですが、もう少し詳しい書籍が必要だと思っていました。しかし、Amazon で日本語の書籍を探してみたのですが、よさそうなものが見当たりません。最近、Appleの英語の資料を読み始め、英単語については、拙作 Wordbook2*1 で勉強しているので、洋書を読んでみようと思い立ちました。

それで

Practical Common Lisp (Books for Professionals by Professionals)

Practical Common Lisp (Books for Professionals by Professionals)

を買ってみました。購入して正解でした。

本当に丁寧に説明してあります。Optional Parameter (&optional)、Rest Parameter(&rest)、Keyword Parameter(&key) についての説明もあります。

実行環境は [id:KYoshiaki:20070225] と同じく Carbon Emacs を用いました。今回は Emacs Lisp (Elisp) ではなく Common Lisp を使う必要があります。それで書籍に紹介されている sbcl、SLIME を利用することにしました。

Leopard 以前は Fink を利用していたのですが、これを機会に MacPorts に変更することにしました。

The MacPorts Project -- Home
http://www.macports.org/
MacWiki - MacPorts
http://macwiki.sourceforge.jp/wiki/index.php/MacPorts

を参考に設定した後、パッケージ sbcl をコマンド

~ $ sudo port install sbcl

を使ってインストールしました。

また Carbon Emacs に表示されている SHA-1 の確認のために

~ $ sudo port install coreutils

を使ってパッケージ coreutils をインストールしました。
このパッケージには md5、md5sum、sha1sum などのコマンドが含まれています。ただし接頭語として g が追加されています。(gmd5、gmd5sum、gsha1sum というコマンド名になります。)

port コマンドに次の引数を渡すと、どのパッケージに含まれているか確認できます。

~ $ port provides /opt/local/bin/gsha1sum
/opt/local/bin/gsha1sum is provided by: coreutils

そして

Carbon Emacs パッケージ
http://homepage.mac.com/zenitani/emacs-j.html
Emacs をダウンロード (2008年春版; 40.8 MB)
SHA1: be4d67c6d44d937a7525fc3a8a739c443021ae29

からダウンロードしたファイル CarbonEmacs-Tiger-20080405.dmgSHA-1 を gsha1sum コマンドで求めると

~/Downloads $ gsha1sum CarbonEmacs-Tiger-20080405.dmg
be4d67c6d44d937a7525fc3a8a739c443021ae29  CarbonEmacs-Tiger-20080405.dmg

と表示されます。 私は SHA-1 が等しいか判断するためにスクリプト compare.sh

 $ cat ./compare.sh
#!/bin/sh
MD1="$1"
MD2="$2"
if [ $MD1 = $MD2 ] ; then
echo "match"
else
echo "failure"

を使っています。基本的にUnix についての知識は乏しいので、もっと良い方法があるかもしれません。

ただ単純に

Carbon Emacs パッケージ
http://homepage.mac.com/zenitani/emacs-j.html
Emacs をダウンロード (2008年春版; 40.8 MB)
SHA1: be4d67c6d44d937a7525fc3a8a739c443021ae29

に表示されている SHA-1 と gsha1sum で求めた SHA-1 をコピーして、コマンド compare.sh の引数として渡し

~ $ ./compare.sh be4d67c6d44d937a7525fc3a8a739c443021ae29  be4d67c6d44d937a7525fc3a8a739c443021ae29
match
~ $ 

match と表示されれば成功です。

SLIME については

SLIME: The Superior Lisp Interaction Mode for Emacs
http://common-lisp.net/project/slime/

から slime-2.0.zip をダウンロードしました。ファイル slime-2.0.zip を展開して作成された “slime-2.0” フォルダをホームフォルダに移動し、同封の ReadMe を参考に .emacs ファイルを

 (add-to-list 'load-path "~/slime-2.0/")  ; your SLIME directory
(setq inferior-lisp-program "/opt/local/bin/sbcl") ; your Lisp system
(require 'slime)
(slime-setup)

と設定しました。

Carbon Emacs 上で `M-x’ slime ( ESC-x slime ) と入力すると SLIME が起動します。
カーソルをファイル内の評価したい式に移動し C-c C-c と押せば実行できます。

現在、

Practical Common Lisp (Books for Professionals by Professionals)
Peter Seibel 著
CHAPTER 7 MACROS: STANDARD CONTROL CONSTRUCTS
DO

を読んでいる途中です、[id:KYoshiaki:20070225] で書いたフィボナッチ数列

F_{n}=\left\{{1 \text{ \(n=1, 2\)}\atop{F_{n-1} + F_{n-2} \text{ \(n\geq 3\)}}}\right.

もでてきます。

Practical Common Lisp (Books for Professionals by Professionals) の例

(do ((n 0 (1+ n))
(cur 0 next)
(next 1 (+ cur next)))
((= n 10) cur))

入門Common Lisp―関数型4つの特徴とλ(ラムダ)計算 の例

(defun fib (n)
(cond ((= n 1) 1)
((= n 2) 1)
(t (+ (fib (- n 1)) (fib (- n 2)))))) 

動作を説明しやすいように n = 5

(do ((n 0 (1+ n))
(cur 0 next)
(next 1 (+ cur next)))
((= n 5)
(format t "~%~d" cur)))

とします。

実行結果は

5
CL-USER> 

となります。入門Common Lisp の fib を使っても

CL-USER> (fib 5)
5

と同じ値になります。

変数の移り変わりを表で表すと

n cur next
0 0 1
1 1 1
2 1 2
3 2 3
4 3 5
5 5 8
n cur next
0 F_{0} F_{1}
1 F_{1} F_{2}
2 F_{2} F_{3}
3 F_{3} F_{4}
4 F_{4} F_{5}
5 F_{5} F_{6}

ただし F_{0} = 0 とする。

になります。

また、CHAPTER 7 の最後に出てくるフィボナッチ数列を求める関数の動作も表にしてみました。
CHAPTER 22 を読んで LOOP についてだいたい理解しましたが、finally の挙動については自信がありません。

(format t "~%~d"
(loop for i below 5
and a = 0 then b
and b = 1 then (+ b a)
finally (return a)))
i a b
0 0 1
1 1 1
2 1 2
3 2 3
4 3 5
finally 5 5 8

実行結果

5
CL-USER> 

特に for と and の違いを理解するにに苦労しました。

(loop for var = initial-value-form [ then step-form ]  ...)

for を利用する場合

(format t "~%~a"
(loop for i below 5
for x = 0 then y
for y = 1 then (+ x y)
collect y))
i x y
0 0 1
1 1 2
2 2 4
3 4 8
4 8 16

実行結果

(1 2 4 8 16)
CL-USER> 

and を利用する場合

(format t "~%~a"
(loop for i below 5
and x = 0 then y
and y = 1 then (+ x y)
collect y))
i x y
0 0 1
1 1 1
2 1 2
3 2 3
4 3 5

実行結果

(1 1 2 3 5)
CL-USER> 

*1:Wordbook2: まだ公開していません。取扱説明書を作成中です。