IT戦記 このページをアンテナに追加 RSSフィード Twitter

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!"]

schemeeval みたいな感じ

エラーの補足

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 とは

ここを見て

hash関数 - 初学者の箸置

Ruby で使われている st.c ってなんなんだろうと思って調べてみた

いろいろ使われてる

ちょっとググったら、いろいろと使われているみたいですね

  • Ruby
  • Syck
  • Oniguruma
  • CPAN の File::MMagic::XS モジュール

ライセンス

ライセンスがパブリックドメインなので、何も考えないで使えて良さそう。

よくわかる解説がありました

第3章 名前と名前表

駄文 - 4 月からプログラマになったあなたへ

こういう取り組みいいですね

スタートアップ研修記

こういうブログを読んでいると

新人だったときの記憶が蘇ってきますね。

というわけで、僕からのアドバイスをいろいろ書いておきます。

この記事は新プログラマあなたに向けたメッセージです^^「なんか、ブログで書いてる人いるなー。」って感じじゃなくて「僕(私)に言ってる」と思って読んでもらえたらうれしいです。

新人プログラマへのアドバイス

  • プログラミングの勉強をしましょう
  • ブログを書きましょう
  • 社外のエンジニアと交流しましょう
  • コミュニティに参加しましょう
  • 技術イベントに参加しましょう
  • 飲み会に参加しましょう
  • 僕と飲みにいきましょう

僕のメールアドレス

↓とりあえず、飲み会のお誘いはこちら。 _at_ は @ に置換してね

seijro_at_gmail.com

プログラマと交流するときのアドバイス

  • ぶっちゃけ話をしましょう
  • 技術の話をしましょう
  • キラキラした目線で率直に質問をしましょう
  • 言い訳をしない(例:うちはヲーターフォールだから〜、上流行程ばかりで〜)

まとめ

とりあえず、がんばれ!未来は僕らの手の中だ!