Tcllib

Tcllibは、100% Pure Tclで記述されたTclの標準ライブラリです。
コンパイル不要なので、マルチプラットフォームでお気軽に利用できます。
機能は順次追加されていますが、V1.2では以下のパッケージが利用できます。
パッケージ名からおおよその機能は推測できると思います。

base64, calendar, uuencode, cmdline, comm, control, counter, cksum, crc32,
sum, csv, dns, exif, fileutil, ftpd, ftp, html, htmlparse, irc, javascript,
log, math, md5, mime, smtp, ncgi, nntp, pop3, profile, report, sha1, smtpd,
stats, stooop, graph, matrix, queue, stack, tree, expander, textutil, uri

※実は、最近出没したC言語で記述されたTclライブラリTATも気になります。(^^;)
こちらも動向を見守りたいと思います。

Base64

Base64のエンコードとデコードを行うためのプロシジャです。

package require base64

# JISコードに変換した日本語をエンコードする
set code [::base64::encode [encoding convertto iso2022-jp 本日は晴天なり]]
=> GyhCGyRAS1xGfCRPQDJFNyRKJGo=
# デコードしたJISコードをUNICODEに変換する
encoding convertfrom iso2022-jp [::base64::decode $code]
=> 本日は晴天なり

Uuencode

Uuencodeのエンコードとデコードを行うためのプロシジャです。

package require uuencode

# JISコードに変換した日本語をエンコードする
set code [::uuencode::encode [encoding convertto iso2022-jp 本日は晴天なり]]
=> GyhCGyRAS1xGfCRPQDJFNyRKJGo=
# デコードしたJISコードをUNICODEに変換する
encoding convertfrom iso2022-jp [::uuencode::decode $code]
=> 本日は晴天なり

Control

いくつかの制御文のためのプロシジャです。

assert文はプログラムに診断機能を付け加えます。デバッグ時に役立ちます。
引数で指定した条件が偽の場合、エラーメッセージを出力します。それ以外の場合は何もしません。

assert文
package require control

# assertionを有効にする
::control::control assert enabled 1
# Tclが8.3でなければassertionが発生する
::control::assert {$tcl_version == 8.3}

assertでエラーが発生した時のコールバックを設定できます。
以下の例はassert発生時に、tk_messageBoxを呼び出し、メッセージボックスにエラーを表示します。

assert文
package require control

# assertionを有効にする
::control::control assert enabled 1
# コールバックを設定する
::control::control assert callback {tk_messageBox -message}
# Tclが8.3でなければassertionが発生する
::control::assert {$tcl_version == 8.3}

do whileは引数で指定した条件の間ループします。
Tclのbreak, continue, error等の制御文と組み合わせて使えます。

do while文
package require control

# 初期値を0にする
set i 0
# 10になるまでループする
::control::do {
	incr i
} while {$i < 10}

do untilは引数で指定した条件までループします。
Tclのbreak, continue, error等の制御文と組み合わせて使えます。

do until文
package require control

# 初期値を0にする
set i 0
# 10になるまでループする
::control::do {
	incr i
} until {$i >= 10}

Tcl Coreのwhile文とTcllibのdo while(until)文はcatch文の振る舞いが異なります。

do文の制限事項
package require control

# while文
proc a {} {
    while 1 {
        return -code error a
    }
}
# do while文
proc b {} {
    ::control::do {
        return -code error b
    } while 1
}
catch a
=> 1
catch b
=> 0 

no-op文は、何もしない文です。無効なassert文と同じ振る舞いをします。

no-op文
package require control

# 何もしない
::control::no-op {set a 1}
# 何もしない
::control::no-op set b 1

Csv

CSV形式のデータを扱うためのプロシジャです。

package require csv

# リスト形式をCVS形式に変換する
::csv::join {a b c {x y}}
=> a,b,c,x y
# リストのリスト形式をCVS形式に変換する
::csv::joinlist {{a b} {1 2} {x y}}
=> a,b
=> 1,2
=> x,y
=>
# CVS形式をリスト形式に変換する
::csv::split {a,b,c,x y}
=> a b c {x y}

Exif

デジカメなどの画像ファイル(EXIFファイル)からカメラ情報を読み出すためのプロシジャです。
ヘルプによるとChris Breezeさん作成のexif.pl(Perlスクリプト)を移植したものだということです。

使い方はとっても簡単で、指定した配列変数にカメラ情報を返します。

package require exif

# ファイルを開く
set fd [open hoge.jpg r]
# カメラ情報を解析する
array set answer [::exif::analyze $fd]
parray answer
# 有効な要素名を得る
::exif::fieldnames
# ファイルを閉じる
close $fd

標準のタグに対応する以外に、CanonのG1D30の独自タグにも対応しています。
今のところ、EXIFファイル内のサムネイル画像を抽出するような機能はありません。

不幸なことに、オリジナルexif.plのバグまで忠実に移植されています。(^^;)
仕方ないので、修正パッチを作成してSourceForgeにポストしました。
パッチが採用されるかは不明ですが、こちらにパッチと修正版を置きました。

ついでに、強引に日本語したexifパッケージを作りました。(^^;)
今後は、本体を修正しないように改良するつもりです。
とりあえず、上記パッチも当たっています。 以下は、Exifの関連情報へのリンクです。