CafeOBJ では、識別子 (モジュール名、ソート名、オペレータ名等) に日本語を用いることができる。
例えば、次のような仕様を記述できる。
mod! 都道府県名 {
[ 都道府県 ]
ops 北海道 青森県 秋田県 岩手県 ... -> 都道府県
}
CafeOBJ で日本語の識別子を使うには、環境変数 LANG
を ja_JP
に設定し、CafeOBJ を起動する。Windows 版では環境変数 ACL_LOCALE
を ja_JP
に設定する。
※ 端末やファイルのエンコーディングシステムとは関係なく、常に ja_JP
を指定する。UTF-8 を用いて仕様を記述するからと言って、ja_JP.UTF-8
を指定するとうまくいかない。これは COMMON LISP 側の多言語対応処理との干渉を防ぐための設定である。CafeOBJ 自身は日本語文字列をただのバイトストリームと扱う。
例えば典型的な Unix 環境では、次のようにタイプする。
$ /bin/bash -c 'LANG=ja_JP ; cafeobj'
Windows では、cafeobj.bat を以下のように書き換える。
SET ACL_LOCALE=ja_JP CafeOBJ.exe --
環境変数の設定方法については本稿の範囲を超えるため、ここでは上記の例を示すにとどめる。
CafeOBJ の仕様を記述するファイルの文字コードは EUC または UTF-8 がよい。シフトJISを使うこともできるが、通常のプログラミング言語でバックスラッシュ '¥
' が予期せぬ結果を起こすように、同様の問題が発生する。以下に例を示す。
-- シフトJIS で 0x5f _ を含むような文字 mod TEST { op 雲 : -> Bool -- '雲'の文字コードは 0x895f }
この仕様をシフトJISで保存し、CafeOBJに読み込ませると、「雲」の2バイト目の文字が0x5f (下線 '_
' にあたる) ので、これが引数の位置と解釈され、以下に示すように誤った宣言になる。
CafeOBJ> in test-contains-0x5f.mod processing input : test-contains-0x5f.mod [Warning]: # of arguments mismatch for mixfix operator `?_', ignored. -- defining module TEST._* done. CafeOBJ>
CafeOBJ では他に '[
' (0x5b) 、']
' (0x5d) 、'{
' (0x7b) 、'}
' (0x7d) が特殊な扱いを受けるので、同様の問題を起こすことになる。
Original Copyright © Takahiro Seino, all rights reserved.