Subject: -IV- C 以外で, どんな言語が Tcl/Tk と使えるの?


A. シェル
様々なシェル形式のインタフェースが存在します.最初にあげられる
のは tclsh で,これはTclインタプリタの実装例のサンプルとして,Tcl配布
品のなかに含まれるものです.さらに,Tk配布品に含まれるシェル形式のイン
タフェースとして,wishが存在します.その他の多くの拡張でも,(それを組
み込んだ)インタプリタを配布しています.tclX拡張が,例としてあげられる
でしょう.これは,tcl と,もう一つ,wishx と呼ばれる2つのインタプリタ
を構築します.

B. C++

C++ クラスから Tcl オブジェクト型への変換を支援するのに使える,
Objectify と呼ばれるパッケージがあります.

Tcl と一緒に C++ を使いたいならば,C++ でコンパイルされるソー
スファイル中に main() 関数を定義しなければなりません.これは,main 関
数前に必要な C++ の初期化コードが実行されることを保証するためです.

C++ のリンク機能:
extern "C" ... prototype ...
を使って,C++ の名前管理を避けたプロトタイプ宣言を行った Tcl や Tk (
や,他の C コード) ルーチンを,C++ から呼び出すことができます.

幸いにも,tcl.h と tk.h は,C++ でコンパイルされると,この機能
を提供してくれるので,単にこれらを直接使うだけでよいでしょう.

通常の tcl や tk のそれを使って,main 関数を定義することもでき
ますし,幾つかの拡張を組み込みたいならば,tkMain.c と tkAppInit.c を使っ
てもできるでしょう.Ken Yap のパッチは以下で得られます.この
URL:ftp://ftp.aud.alcatel.com/tcl/distrib/tk3.2forC++.patch
は,tk 3.2 の main.c や,幾つかのルーチンにパッチを当て,C++ コンパイ
ラでのコンパイルを可能にします.このコードに関しては,Ken Yap
URL:mailto:ken@syd.dit.csiro.auに感謝します.

C++ 関数や静的クラス・メンバ関数の内部で,Tcl_CreateCommand を
用いる通常の方法で Tcl コマンドを生成することができます.非静的メンバ
関数では,簡単にはいかないでしょう.Tcl が,"this" ポインタを供給しな
ければならないからです.

拡張 Tcl の tcl++.h を取り出してみるとよいでしょう.Parag
Patel のオリジナルの実装をベースに,C++ のオブジェクトとして Tcl イン
タプリタを生成する Tcl インタプリタクラスを定義しています.

Mark Diekhans と Karl Lehenbauer は,これを使って,拡張 Tcl の
ハンドル機能と組合せ,C++ クラスまわりの Tcl コマンドを作成しました.

この Tcl ハンドル機能は,Tcl コードからのテキストハンドルで参
照できる,表項目管理の方法を提供します.これは,一つのコマンドでデータ
構造を生成する必要のあるアプリケーションに,特定のデータ構造への参照返
し(例えば,ポインタ) や,他のコマンドからのデータ構造へのアクセスを可
能にします.例としては,ファイルハンドルがあげられます.

ハンドルのテーブルは,Tcl からアクセスされるクラスのインスタン
スのポインタを格納しています.例えば,クラスを `foo_cl' として,コマン
ド "new" を,このインスタンスを生成し,インスタンスへの Tcl ハンドルを
返すコマンドとして定義します.そうすると,ハンドルをメンバ関数からアク
セス可能とすることが出来ます.ハンドルは,実際には `this' ポインタです.

例えば:

set obj [foo_cl::new]
foo_cl::baz $obj "Hello world"
foo_cl::delete $obj

これは,オブジェクト指向の全てではありませんが,非常に便利ではあります.

C. Modula-3
Norman Ramsey URL:mailto:elan.uucp!nr によると:
昔,Eric Muller 氏が C Tcl ライブラリへの Modula-3 インタフェー
スを投稿していました.私は,C の型ではなく,Modula-3 の型を使い,コマ
ンドのクロージャを組み立てるのにオブジェクトを使った,Modula-3/Tcl イ
ンタフェースを書き下ろしています. 私は,実装の一部を書き終えましたが,
まだ完了してはいません.私は,質問をした URL:mailto:carroll@udel.edu
には,コピーをメールしました.もし,これが一般に興味を持たれるものでし
たら投稿したいと思います.

また,gatekeeper.dec.com の Modula-3 アーカイブの一部として,
Tk と Modula-3 のインタフェースが存在します.

D. Eiffel
URL:mailto:stephan@cs.tu-berlin.de (Stephan Herrmann) による
と:
... 2 つのプログラム言語を 1 つのハイブリッド・プログラミング・
アーキテクチャに合成することにより,異なった原理の結合を,
[tclish パッケージはもたらします].

ユーザ向けに 3 つのクラス - tcl インタプリタ,tk アプリケーショ
ン,tk ウィンドウがあります.詳細は,
URL:ftp://hepunx.rl.ac.uk/pub/eiffel/tclish を参照のこと.

E. Ada
URL:mailto:dennis@dennis.cs.colorado.edu (Dennis Heimbigner)
は,Ada プログラムから Tcl インタプリタへのアクセスを可能とする adatcl
パッケージを紹介しています.詳細情報については,"tcl-faq/part04"を参照
して下さい.

F. Perl

2 つの異なったプロジェクトが進行中です.comp.lang.perl の,
Perl version 4 や version 5 に,Tk ライクなインタフェースを追加しよう
とする議論を参照して下さい.私の理解する所,これは,実際の Tcl のコー
ドというよりは,Tk のアイディアを頂戴したインタフェースである様です.

G. その他

Python と Tk を統合する作業が進行中です.ほとんどが Python の
コードであるので,comp.lang.python を中心に議論が進んでいます.

Fresco CORBA 関係の作業が,その環境とやりとりする Tcl ベースの
インタプリタを生み出しました.

Dylan 言語へ Tk をバインドする作業もまた,研究中です.

Duncan Sinclair URL:mailto:sinclair@dcs.gla.ac.ukは,wish.c
の,Tk から他言語へのフックに付いて詳細なハッキングを行い,Haskell や
遅延 ML の様な関数型言語へのコミュニケーションに使っています.論文とサ
ンプルコードは,匿名 ftp:
URL:ftp://ftp.dcs.gla.ac.uk/pub/glasgow-fp/authors/Duncan_Sinclair/fumx.*
から入手可能です.

InterLanguage Unification 計画は,インタフェースによってソフ
トウェアの相互運用性を向上させるシステムです.これは,Common Lisp,
ANSI C,C++,Modula 3 とやりとりでき,さらに,Python,Tcl,そして GNU
Emacs-lisp を,間もなく加える予定です.

もちろん,Wafe アプリケーション環境は,Tk を基礎に用いて,幾つ
かの言語から X 上のアプリケーションを作りやすくするために設計されてい
ます.

幾つかは使えるベータベースに Oracle のみというような制限はあり
ますが,何種類かの SQL へのインタフェースが存在します.
Micha Meier によって保守されている,Prolog から Tcl/Tk へのインタフェー
スがあります.
シリコングラフィックスのマシン用の,SGI の GL 言語インタプリタがありま
す.
WOOL へのインタフェースが存在します.

これら力作に関する詳細は, tcl-faq/part04 参照のこと.