識別子で日本語を使う

CafeOBJ では、識別子 (モジュール名、ソート名、オペレータ名等) に日本語を用いることができる。

例えば、次のような仕様を記述できる。

mod! 都道府県名 {
  [ 都道府県 ]
  ops 北海道 青森県 秋田県 岩手県 ... -> 都道府県
}

CafeOBJ の起動方法

CafeOBJ で日本語の識別子を使うには、環境変数 LANGja_JP に設定し、CafeOBJ を起動する。Windows 版では環境変数 ACL_LOCALEja_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.