正月でおめでたいので一年ぶりにpseriesのマイクロコードをアップデート。
コイツは去年最高の買い物だった。
最初はジャンクで起動しなかったけれど、PCIのServeRAIDを抜いたら動いたんだよなぁ。
嬉しかった。
# lscfg -vp | grep -p Platform
Platform Firmware:
ROM Level (alterable).......3R061030
Version.....................RS6K
System Info Specific.(YL)...U0.1-P1/Y1
Physical Location: U0.1-P1/Y1
10分くらいかかって無事成功。
Haskell関係で。
GHCAIXにインストール。
GHCのサイトからAIX用のパッケージをダウンロード。
GMPをまずコンパイルしてインストール。
その後GHCをインストール。
$ /usr/local/bin/ghc --make hallo.hs
Chasing modules from: hallo.hs
Skipping Main ( hallo.hs, hallo.o )
Linking ...
ld: 0711-317 ERROR: Undefined symbol: .__gmpz_init
ld: 0711-317 ERROR: Undefined symbol: .__gmpz_add
ld: 0711-317 ERROR: Undefined symbol: .__gmpz_sub
ld: 0711-317 ERROR: Undefined symbol: .__gmpz_mul
ld: 0711-317 ERROR: Undefined symbol: .__gmpz_gcd
ld: 0711-317 ERROR: Undefined symbol: .__gmpz_tdiv_q
ld: 0711-317 ERROR: Undefined symbol: .__gmpz_tdiv_r
ld: 0711-317 ERROR: Undefined symbol: .__gmpz_divexact
ld: 0711-317 ERROR: Undefined symbol: .__gmpz_and
ld: 0711-317 ERROR: Undefined symbol: .__gmpz_ior
ld: 0711-317 ERROR: Undefined symbol: .__gmpz_xor
ld: 0711-317 ERROR: Undefined symbol: .__gmpz_com
ld: 0711-317 ERROR: Undefined symbol: .__gmpz_tdiv_qr
ld: 0711-317 ERROR: Undefined symbol: .__gmpz_fdiv_qr
ld: 0711-317 ERROR: Undefined symbol: .__gmpn_gcd_1
ld: 0711-317 ERROR: Undefined symbol: .__gmpn_cmp
ld: 0711-317 ERROR: Undefined symbol: .__gmp_set_memory_functions
ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information.
collect2: ld returned 8 exit status
リンクが出来ない。
どうやらめんどくさい系エラーみたい。
あきらめる。
AIX4.3用だからだめなのか?
Haskell
main = putStrLn "こんにちは!"
が出来ないことについて2chに質問したら、親切にテンプレ作ってくれた。
____________________________________________________________________________________________________________________________________________
GHC6.4ではEUCだったらソースコード中に書いてもコンパイル可能。
putStrなどで出力するとEUCのまま出力される。
そのため、WindowsではEUC→ShiftJIS変換を掛けた後putStrしないとうまく表示できなかった。

GHC6.6ではソースコード文字コードUTF-8になったため、
UTF-8形式でなら日本語の文字列をソースコードに記述できるようになった。
しかし、putStrなどのIOの基本部分はまだきちんとUTF-8対応してないため、
UTF-8形式の文字列をそのまま出力させることができない。
ただ、6.4のときと同じようにUTF-8→ShiftJIS変換して出力させるのなら表示できる。

Haskell98によると、Charは一つのUnicode文字を表す(6.1.2)。
これに従って、比較的新しいHugsGHC(6.4系を含む)ではCharは32ビット整数になっている。
ただし、どちらも入出力に際しての変換が完全でない。具体的には、
ソースコード中の文字列リテラル
・System.IOライブラリでの入出力
が問題になる。

1. GHC6.4.2以前
ソースコード・入出力ともLatin-1を仮定する。Latin-1ではバイト値と
コードポイントが一致するので、入力時には外部エンコードの各バイトがそのままCharに
入り、出力時にはCharの下位8ビットのみが出力されるような実装になっている。
このため、あるエンコーディング(Latin-1とは限らない)の入力をgetLineで受け取り、
それをそのままputStrで表示すれば、入力時とおなじエンコードにおいて正しく表示される。
これを利用して、[Char]を、本来のコードポイントの列としてではなく、特定のエンコードの下での
バイト列として使うことができる。ただし文字列リテラルについては、GHCはLatin-1として
不正な文字を受け付けないので、EUC-JPのような例外を除くと、単純にリテラルを使うことはできない。

2. GHC6.6
ソースコードにはUTF-8、入出力にはLatin-1を仮定する。このため、EUC-JPでリテラルを直に
書くことはできない。
3.最近のHugs(非WindowsかつCのwchar_tがUnicodeの環境、というかLinux)
ソースコード・入出力ともロケールエンコードを利用する。

4.最近のHugs(Windows)
ソースコード・入出力ともLatin-1を仮定する。ただし文字列リテラルにShift-JISを使ってもエラーにならない。

5.最近のHugs(それ以外)
未調査。

・結局どうするか。
規格どおりにCharにUnicodeを入れるか、Charを単なるバイトとして扱うかの二択。

i. CharをUnicodeとして扱う
(3)以外の場合入出力で変換が必要。(2)または(3)以外の場合文字列リテラルでは
明示的なエスケープ(たとえば"\22234")が必要。

ii. Charをバイトとして扱う
(3)ではファイルをバイナリモードで開くなどの対策が必要。(1)でEUC-JPを使う場合と(4)
を除き文字列リテラルでは明示的なエスケープ(たとえば"\143\153")が必要。
lengthやisAlphaのような関数、およびwin32パッケージの関数(win32API)が正しく動作しない。
____________________________________________________________________________________________________________________________________________

ありがたや。