HCl の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"
実行中のHCl 自身のプロセスIDを取り出すために
system::unix-getpid
が用意されています。
[1]->(system::unix-getpid)
1235
[2]->
HCl から関数
systemによってshを引数付きで呼び出せます。systemの値は
起動されたコマンドの終了コード(integer)です。
[1]->(system "csh") ;;cshを起動する。
[2]->(system "ls -lt") ;;lsを起動する。
loadは引数としてファイル名を連想させるstring,
symbolあるいはpathnameを取ります。このとき実際のファイルはある定め
られたシーケンスで探されます。例えば(load "hclsample")とした
場合、通常は以下の順序で探されます。
- ./hclsample
- ./hclsample.fasl
- ./hclsample.lsp
- ./hclsample.lisp
- ./hclsample.cl
- ./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の外字,半角カナの対応はまだなされていません
もくじ