どう書く?orgで「漢数字で九九の表」というのを見つけて、
「そう言えばAdaって受け付ける文字コードがUCSって事になってるんだから普通にできるんじゃね?」
と思ったのでやってみました。
折角だから埋め込み文字列排除(つまり「"」出現禁止)の方向で。
with Ada.Wide_Text_Io, Ada.Strings; use Ada.Wide_Text_Io; procedure Kuku is type 漢数字 is (〇, 一, 二, 三, 四, 五, 六, 七, 八, 九, 十); begin for 左 in 一..九 loop for 右 in 一..九 loop declare 積:Integer:=漢数字'Pos(左)*漢数字'Pos(右); 十の位:漢数字:=漢数字'Val(積/漢数字'Pos(十)); 一の位:漢数字:=漢数字'Val(積 rem 漢数字'Pos(十)); begin if 十の位/=〇 then Put(漢数字'Wide_Image(十の位)); else Put(Ada.Strings.Wide_Space&Ada.Strings.Wide_Space); end if; Put(漢数字'Wide_Image(一の位)); Put(Ada.Strings.Wide_Space&Ada.Strings.Wide_Space); end; end loop; New_Line; end loop; end Kuku;
ARM読んでも、結局discrete type*1の要素数を得る属性が分からなかったので、漢数字は十まで。
% gnatmake kuku gcc -c kuku.adb kuku.adb:4:10: illegal character kuku.adb:6:09: illegal character kuku.adb:7:12: illegal character kuku.adb:9:14: illegal character kuku.adb:10:13: declaration expected kuku.adb:10:14: illegal character kuku.adb:11:13: declaration expected kuku.adb:11:14: illegal character kuku.adb:13:17: illegal character kuku.adb:14:21: illegal character kuku.adb:18:18: illegal character gnatmake: "kuku.adb" compilation error
って通らないし……。
ytさんのAdaサンプル集や、gnatmake -gnathによると、どうやらASCII以外を通すには-gnatWが必要なようです。
% gnatmake -gnath Usage: gnatmake opts name {[-cargs opts] [-bargs opts] [-largs opts] [-margs opts]} (略) -gnatW Wide character encoding method (h/u/s/e/8/b)
UTF-8だから、-gnatW8なのかな?
他が気になるけど…まぁUTF-8以外使わないので気にしない事にします。*2
% gnatmake -gnatW8 kuku gcc -c -gnatW8 kuku.adb gnatbind -x kuku.ali gnatlink kuku.ali
おお、ちゃんとコンパイル通りますね。
% ./kuku 一 二 三 四 五 六 七 八 九 二 四 六 八 一〇 一二 一四 一六 一八 三 六 九 一二 一五 一八 二一 二四 二七 四 八 一二 一六 二〇 二四 二八 三二 三六 五 一〇 一五 二〇 二五 三〇 三五 四〇 四五 六 一二 一八 二四 三〇 三六 四二 四八 五四 七 一四 二一 二八 三五 四二 四九 五六 六三 八 一六 二四 三二 四〇 四八 五六 六四 七二 九 一八 二七 三六 四五 五四 六三 七二 八一 %
できたー!
ここまで書いて、そう言えば「どう書く?」のアカウント持ってる事を思い出しましたが…
今からそっちにも投稿するのも面倒だからいいかな…。
*1:日本語だと「離散型」?
*2:http://hp.vector.co.jp/authors/VA028375/ada/log.html(これまたytさんのAdaのページ)によると、sがShift-JIS、eがEUCらしいです。…ytさんには頭が上がりません。