コンテンツにスキップ

Tcl

出典: フリー百科事典『ウィキペディア(Wikipedia)』
Tcl
最新版

8.6.12[1] / 2021年12月5日 (2年前) (2021-12-05)

最新評価版

Tcl/Tk 8.7a5[2] / 2021年6月12日 (2年前) (2021-06-12)

リポジトリ ウィキデータを編集
対応OS クロスプラットフォーム
プラットフォーム クロスプラットフォーム
ライセンス オープンソース
公式サイト https://www.tcl.tk/
テンプレートを表示
Tcl
パラダイム 手続き型
登場時期 1988年
設計者 John Ousterhout
開発者 John Ousterhout、Tcl コアチーム
最新リリース 8.6[3]/ 2012年7月27日 (11年前) (2012-07-27)
型付け 動的型付け
主な処理系 ActiveTcl
影響を受けた言語 AWKLISP
影響を与えた言語 PowerShell[4]、Tea
ウェブサイト tcl.sourceforge.net
拡張子 .tcl
テンプレートを表示

Tcl

TclGUITkGUITcl/TkTkGUITclPerlPythonRuby

Tcl/TkTclGUITk GUIUNIXWindowsMacintoshTcl/TkTclet

[]


Tcl[ 1]1988使 UNIX TclTclC

TkTclGUI1990TclApple HyperCardTclTkTclTcl 使TkTcl/TkGUITkTclPerlPerl/TkPythonTkinterRuby Ruby/TkGUITk

1994-1998Tcl/Tk WWW Tcl/TkTk GUITcletTclUNICODETcl/TkWWWTk

退Tcl/Tk2000Tcl/Tk

2005TclTcl/TkPerlPythonRubyEDAWebTcl使TkGTK+QtGUI

Tcltool command languageTktoolkit

特徴[編集]


Tcl

TclTcl





LISP 

[]


{}
 This is {a pen}

リストの抽出[編集]

Tclパーサーがソースコードからコマンド行としてリストを取り出すとき、ひとつのリストの終端は改行コードかセミコロン(;)で判断する。しかし改行コードやセミコロンがブレスの内側にあれば、それをリストの終端記号とは見なさない。したがって、以下の3行の文字列は3つの要素から成るひとつのリストである。改行コードは3個あるが、最後の改行コードだけがリストの終端記号の役割を果たす。

 if {$a<0} {
   set a 0
 }

上記リストは Tcl の if コマンドでありC言語の if 文に似ている。しかしブレスがリスト記述記号として採用されているので似ているだけである。上記の if コマンドを以下のように改行の位置を変えると、ifコマンドの引数エラーになる。

 if {$a<0}
 {
   set a 0
 }

Tcl42if

 ifTclTclTcl

[]


Tcl[]
 set a [expr 100*2]

$記号(変数置換)[編集]

Tclパーサーは変数機能の提供によりコマンド間でのデータの受け渡しも扱ってくれる。変数はsetコマンドにより生成される。そして、$記号が先頭に付いた要素を変数名とみなし、その値に要素全体を置換する。これが「変数置換」である。

 set a {This is a pen.}
 puts $a



1$

21 eval 

[]


{}$
 puts {[expr 100*$num] }


[expr 100*$num] 円

 puts "
 puts "[expr 100*$num] 円"

num3
300 円



Tcl Tcl "
 set text 石を投げたら"ゴツン"と音がした

セミコロン記号(マルチコマンド)[編集]

複数のコマンドを1行に記述したい場合はコマンド行をセミコロン(;)で区切れば良い。

 set a 100 ; set b 200; puts [expr $a * $b]

#記号(注釈行)[編集]

コマンドの位置に「#」を記述すると行末までコメントと見なされる。「コマンドの位置に」ということが重要であり、以下の最後のコードは「#」がコマンドの位置にないので誤りである。

 #初期値セット
 # set a 0
 set b 0 ; # 初期値
 set c 0   # 初期値

バックスラッシュ記号[編集]

ひとつのコマンドを複数行で記述したい場合は、行の末尾にバックスラッシュを付ける。

 command $arg1 $arg2 \
          $arg3 $arg4

$文字の前に\を置くと$置換子の機能を抑制して単なる文字として扱わせることができる。

 puts "金額=\$100"

[]{} C\n

[]


Tcl expr 2
 expr $a*$b
 expr {$a*$b}

Tclexprifwhile1 expr 使
 set val true
 if $val {処理}
 while $val {処理}

Tclパーサーは第一引数の「$val」を評価して「true」(文字列)に書き換える。同様に第二引数「{〜処理〜}」を評価して、文字列リテラルなのでそのまま同じ値「{〜処理〜}」に書き換え、以下のようにする。

 if true {処理}
 while true {処理}

Tcltrue  {}  ifwhile ifwhile  expr [expr true] while  {}  expr  true  {} set val false{}  break 
 set val true
 if {$val} {処理}
 while {$val} {処理}

Tcl{$val}4{}ifwhile ifwhile  expr [expr {$val}]while  {}  expr  {$val}  {} set val false false 

switch12
 switch $val {...}
 switch {$val} {...}

({})Tclifwhilefor

[]


TclC load 
 load hello.dll hello

load load  hello  Hello_Init  load 

C Tcl_CreateCommand  Tcl_CreateObjCommand 


int Hello_Init (Tcl_Interp *interp)
  {
  Tcl_CreateObjCommand (interp, "hello", Tcl_HelloCmd, NULL, NULL) ;
  return TCL_OK ;
  }

コマンド本体関数

int Tcl_HelloCmd (ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv [])
  {
  ...
  return TCL_OK ;
  }

Tclargcargv Tcl_CreateCommand Tcl Tcl_CreateObjCommand 

Tcl[]


TclTcl

 double double  double 
 set a 100.0
 set b 200.0
 set c [expr $a * $b]

TclTclTcl char *intdouble int  int double  double Tcl

Tcl list  listA listB  int listA listB 
 set a 100
 set b 200
 set listA "$a $b"
 set listB [list $a $b]

前項で解説したコマンド登録関数の後者(Tcl_CreateObjCommand)は、Tclパーサーからの引数を、無駄に文字列変換することなく、Tclオブジェクトのままで受け取るコマンド関数を登録するためのものである。

返値もTclオブジェクトを通じて返すことができる。下記は long 値をそのまま返す例である。

 /* long値を返す例 */
 Tcl_SetLongObj (Tcl_GetObjResult (interp), longVal) ;

TclTclTclTcl_IncrRefCountTcl_DecrRefCount 0 

Tcl

脚注[編集]

注釈[編集]

  1. ^ : Dr. John Kenneth Ousterhout

[]



(一)^ Changes in Tcl/Tk 8.6.12. 2022620

(二)^ Tcl/Tk 8.6. 2022620

(三)^ Latest Release: Tcl/Tk 8.6.0 (Dec 20, 2012) (20121220). 201314

(四)^ Windows PowerShell : PowerShell and WPF: WTF

[]