2008-04-03
ちょっとだけ tcl の勉強
tcl とは
スクリプト言語です
たまに tcl で書かれてるツールがあるので
tcl の文法を理解しておく
パッと見
tcl のシンボルのようなものは全部文字列。
tcl の行はリスト。
たとえば、以下の行は
package require hoge
LISP でいうと以下のようなデータになる
("package" "require" "hoge")
で、リストの先頭の文字列がコマンドとして実行されていく、コマンド以外のリストのようそはコマンドが数値として扱ったりする。
コマンド
リストの先頭の文字列のことをコマンドっていう。リストが評価されると、コマンドが実行される
print っぽいやつ
puts Hello!
全部文字列だから "Hello!" とかしなくていい。
コメント
puts Hello! # コメント
シャープで書く
空白をリストの区切りじゃなくて文字列の中に入れる
puts 'Hello world!' puts "Hello world!" puts {Hello world!} puts { {Hello} {world!} } # "{Hello} {world!}" という文字列
中括弧かクオートで囲む
中括弧はネスト可能
変数
set hoge fuga
set コマンドが、リストの 2 個目の文字列を変数名として扱って、 3 個目の文字列を代入する。
puts $hoge # fuga と表示される
$ を使って変数を展開する。
展開された変数はそこにクオートされて書かれていたのと同じ挙動をする
set hoge ts pu$hoge "Hello" # Hello と表示される
リストを作る
list hoge fuga
scheme の list みたいな感じ
コマンド置換
puts [join [list Hello world] " "]
コマンドをやった結果を別ので使いたい場合は大括弧を使う
大括弧を全部評価してから、その一個上のリストが評価される。
リストを評価
eval [list puts "Hello world!"]
エラーの補足
catch {
# ここにコマンド
} fid # fid という変数にエラーメッセージが入る
puts $fid
この中括弧もあくまで文字列。 catch コマンドが引数で受け取った文字列を、行単位でリストにしてさらに実行しているだけ
つまり LISP っぽく書くと以下のようなデータ
("catch" " some-command some-command " "fid") ("puts" ("get" "fid"))
プロシージャ
proc hoge { arg1 arg2 arg3 } { puts [join [list "Hello " $arg1] " "] puts [join [list "Hello " $arg2] " "] puts [join [list "Hello " $arg3] " "] }
当然中括弧内は文字列にすぎないので
proc hoge "arg1 arg2 arg3" "...略..."
と書いても同じである。
プロシージャはコマンドと同じように扱える
hoge amachang yamachang kamachang
if とかも文字列文字列
if { cond } {
commands
}
ふー
これで、コマンドリファレンスを見ながらならだいたいの tcl で書かれたツールは読めるようになった。
感想
このメタプログラミング感といい。
「データ = プログラム」なところといい
scheme とすごく似てると思った。
vim の「f」「F」と「;」「,」が便利
f はその行内の 1 文字の後方検索
たとえば、以下のような行を編集していて、カーソルが行頭にあるとして
func を gunc に書き換えようと思ったら ff で func の頭に移動できる。
hoge を moge に書き換えようと思ったら fh で hoge の頭に移動できる。
int func(int hoge, char** fuga);
前方検索は F でできる。
その一文字の検索を繰り返す
セミコロンで出来る。戻るのは、カンマ。
「 *s 」と「 s[] 」の違い
沖林さんがんばれ!
なんか、かわいそうになってきた><がんばってください!
C/C++のポインタの機能--配列との関係 - builder
ところで
僕はちゃんと説明できるかな><
少しでも言葉や概念が変だったら教えてください><
*s
char *s = "hoge";
コードがロードされたときに文字列もメモリにロードされて、実行時にスタックにポインタ変数ができて文字列を指す。
文字列がロードされたメモリのページ(?)には、書き込み権限が付加されないので文字列の内容を書き換えることはできない。
.cstring
str:
.ascii "hoge"
.text
.globl _main
_main:
pushl $str
↑イメージ的にはこんな感じ
s[]
char s[] = "hoge";
コードがロードされたときに文字列もメモリにロードされ、実行時にスタックポインタがガバッとずらされて、その文字列がスタック領域にコピーされる。
スタック領域が存在しているページ(?)には、書き込み権限が付加されているので文字列の内容を書き換えることができる。
.cstring
str:
.ascii "hoge"
.text
.globl _main
_main:
movl $str, %ebx
pushl 4(%ebx)
pushl 3(%ebx)
pushl 2(%ebx)
pushl 1(%ebx)
pushl 0(%ebx)
↑イメージ的にはこんな感じ
うーん
うまく説明できない><
ruby のハッシュで使われている st_hash とは
ここを見て
Ruby で使われている st.c ってなんなんだろうと思って調べてみた
いろいろ使われてる
ちょっとググったら、いろいろと使われているみたいですね
ライセンス
ライセンスがパブリックドメインなので、何も考えないで使えて良さそう。
よくわかる解説がありました
駄文 - 4 月からプログラマになったあなたへ
こういう取り組みいいですね
こういうブログを読んでいると
新人だったときの記憶が蘇ってきますね。
というわけで、僕からのアドバイスをいろいろ書いておきます。
この記事は新プログラマのあなたに向けたメッセージです^^「なんか、ブログで書いてる人いるなー。」って感じじゃなくて「僕(私)に言ってる」と思って読んでもらえたらうれしいです。
新人プログラマへのアドバイス
僕のメールアドレス
↓とりあえず、飲み会のお誘いはこちら。 _at_ は @ に置換してね
seijro_at_gmail.com
プログラマと交流するときのアドバイス
- ぶっちゃけ話をしましょう
- 技術の話をしましょう
- キラキラした目線で率直に質問をしましょう
- 言い訳をしない(例:うちはヲーターフォールだから〜、上流行程ばかりで〜)
まとめ
とりあえず、がんばれ!未来は僕らの手の中だ!
