VectorScriptのインクルード その2

VectorWorksプログラミング実行環境で使える言語「VectorScript」の話。インクルードしたいファイル名を絶対パスで指定するか、相対パスで指定するか、という話(VectorScriptのインクルード その1)の続きです。

普通C/C++などのコンパイル型言語では、コンパイル時にコンパイラーが理解できる相対パスでインクルードするのが一般的。ビルドしてしまえばあとは一体化しているのでプログラムを動かす時はインクルードパスを意識する必要はない。

VectorScriptでも、絶対パスでインクルードファイルを指定するのは無しだと思う。相対パスじゃないと別のマシンで読み込めない。ではインクルードファイルを参照可能な場所とはどこか。

ここではVectorWorksフォルダ(Vectorworksアプリのあるフォルダ)にしてみた。図面ファイルの横に置くと、図面を別の場所に保存するとき、VectorScriptのインクルードするソースファイルもコピーしなくてはならない。Vectorworksフォルダならすべての図面ファイルから参照可能。

メインとなるソースはたとえば次のようになる。

{$INCLUDE xxx}で4つのソースファイルをインクルード

{$INCLUDE xxx}で4つのソースファイルをインクルード。次の図のようにVectorWorksフォルダに「JCLVS」フォルダを置き、ソースファイルとテキストファイルを置いておく。

Vectorworks 2015フォルダに「JCLVS」フォルダ

たとえばダイアログを表示する「My_dlg_2Edit1Cbx.pas」の中身は次。

2つの入力フィールドと1つのチェックボックスを指定するためのダイアログボックスを表示するためのプログラムだ。メインのソースの、{$INCLUDE JCLVS\My_dlg_2Edit1Cbx.pas}のところに「My_dlg_2Edit1Cbx.pas」の中身(231行)が展開されて、構文チェックされる。メインプログラムは飛躍的に読みやすくなった。

メインプログラムの13行目、filenameに「JCLVS\default.txt」を代入してダイアログの関数に渡しいてる。外部ファイル「My_dlg_2Edit1Cbx.pas」のソースから引数でファイル名を渡された「JCLVS\default.txt」を読み込むことができていることにも注目してほしい。

このようにVectorWorksフォルダにソースファイルの一部を置いておくことでメインプログラムの可読性が高まる。メインプログラムを作っている時にうっかりサブプログラムに影響を与えることが減って生産性が高まる。変数のスコープ(有効範囲)を意識して、変数名・関数名にネーミングルールを設けた方がいい。これはソースを分割しない場合でも。

ソースが展開されるだけなので、サブプログラムからメインプログラムの変数は参照できるし、インクルードしているサブファイルが2つ以上あって、両方に同じ関数が定義されているとエラーになるので注意が必要だ。C言語の分割ソースとは異なる。

上記の場合で、たとえばMy_Lib.pasの中で共通ライブラリ「JCL_str.pas」の文字列操作関数を使いたいとする。My_Lib.pasに{$INCLUDE JCLVS\JCL_str.pas}を記述すれば、JCL_strを使えるようになる。が、メインプログラムでも{$INCLUDE JCLVS\JCL_str.pas}が記述されていて二重インクルードのエラーになる。この問題についてはまた次回。