HCl のunixインターフェース


Unixタイプライン引数の読み取り

HCl を起動する時に渡された引数をHCl 内部で読み取ることができます。
%hcl -f filemane
Starting Lisp Listener 1 [USER]
[1]->(system::unix-argc)
3
[2]->(system::unix-argv 0)
"hcl"
[3]->(system::unix-argv 1)
"-f"
	
ここで注意しなければならないのは、 system::unix-argvの値である 文字列は静的な共通バッファに格納されているのでその値は他の関数によって 破壊されることがあるということです。そのため後の参照のために保存する場合は copy-seqなどで一旦コピーして通常のオブジェクトにすることが必要です。 また、-i,-s,-m,-loaddir,-log,-initfileの引数はHCl が特別の意味 に使っているので特別な場合以外は使用しないでください。

環境変数の読みだし

HCl が起動されたシェルの環境変数の値(文字列)は system::unix-getenv によって読み取ることができます。
[1]->(system::unix-getenv "HOME")
"/usr/yamamoto"
[2]->(system::unix-getenv "HCL_IMAGE")
"/usr/hcl/bin/hcl.sav"
	
unix-argvと同様に静的バッファを用いて値が返されるので必要ならばコピー して下さい。

デイレクトリ名の取り出し及び変更

HCl 起動後,カレントデイレクトリ名を知るために system::unix-getcwdが、 それを変更するために system::unix-chdir が用意されています。プロセスIDはユニークなファイル名を作ったり、多重プロセス 環境で他と競合しないTCP/IPのポート番号を作ったりするために必要なことが あります。
[1]->(system::unix-getcwd)
"/usr/yamamoto"
[2]->(system::unix-chdir "../kawasima")
0
[3](system::unix-getcwd)
"/usr/kawasima"
	

プロセスIDの取り出し

実行中のHCl 自身のプロセスIDを取り出すために system::unix-getpid が用意されています。
[1]->(system::unix-getpid)
1235
[2]->
	

Shellの起動

HCl から関数 systemによってshを引数付きで呼び出せます。systemの値は 起動されたコマンドの終了コード(integer)です。
[1]->(system "csh")     ;;cshを起動する。
[2]->(system "ls -lt")  ;;lsを起動する。
	

loadにおけるファイル名の取扱いについて

loadは引数としてファイル名を連想させるstring, symbolあるいはpathnameを取ります。このとき実際のファイルはある定め られたシーケンスで探されます。例えば(load "hclsample")とした 場合、通常は以下の順序で探されます。
  1. ./hclsample
  2. ./hclsample.fasl
  3. ./hclsample.lsp
  4. ./hclsample.lisp
  5. ./hclsample.cl
  6. ./hclsample.l
この順序は内部変数 system::*load-suffixes によって管理されていますからそれを変更することにより、新たなsuffixを 加えたり順序を変えたりできます。また、与えられたファイル名がshell変数 (~,$xxなど)を含む場合はその展開はload時に行われます。 loadは基本的には常にカレントディレクトリを対象にしますが必要ならば 他のデイレクトリも探索の対象にすることができます。その制御は変数、 system:*load-directories によって行われます。system:*load-directoriesのdefault値は NILですが、例えばこれを
[1]->(setq system::*load-directories 
           '("$HCLFASL" "~/fasl/"))
	
とすればもし現在デイレクトリに目的ファイルが存在しない場合に次候補と して\$HCLFASL/のデイレクトリを、さらに無ければ~/fasl/の デイレクトリを探索します。

漢字コードの取扱い

HCl はcharacter, string, symbol のコード要素として漢字(16bit code)を 受け付けることができます。標準インターフェースはEUCコード体系です。 HCl ファイルインターフェースコードはEUCのみが可能です。 またコンソールとの対話に限ってはJIS漢字コードも受け付けます。この切り替えは 自動的に行なわれます。(*) コンソール出力の漢字コードはEUCとJISを選択できます。この切り替えは (si:console-kanji-mode :euc) あるいは(si:console-kanji-mode :jis) を評価することにより行なわれます。

漢字を含む文字列は8bit文字だけの文字列とは内部表現 が異なり、そのreverse,elt,char等の関数は漢字を正しく一文字と認識して 処理します。漢字を含む文字列を(coerse obj 'simple-string)によって simple-stringに変換することが可能です。simple-stringに変換された場合でも 印刷などはなんら問題はありません。しかしsimple-stringに変換された後 ではreverse,elt等が漢字を認識しませんからそれらを実行した場合 思わぬ結果となることがありますが驚かないで下さい。 Symbolに漢字を使用した場合、print-nameの内部表現はsimple-string となっています。


(*)EUCの外字,半角カナの対応はまだなされていません
もくじ