2012年3月21日水曜日

Slimeで日本語を使用する

slimeモードで日本語を使おうと、以下の式を評価すると、

(code-char #\あ)

エラーに遭遇。

Coding system iso-latin-1-unix not suitable for "000041(:emacs-rex (swank:interactive-eval \"(char-code #\あ)\") nil t 1)"

slimeがSwankサーバ(common lispを実行するサーバ)と通信するためのエンコーディング設定 が上手くいっていないため起きるエラー。

slimeがSwankサーバとの通信に使用するエンコーディングは、変数slime-net-coding-systemで 決定される。この変数に'utf-8-unixを設定すると無事日本語が利用できるようになる。以下のように .emacsなどでslime-net-coding-system変数を変更する。

(setq slime-net-coding-system 'utf-8-unix)

すでに、slimeモードでSwankサーバを起動している場合、上記設定の変更を有効にするには サーバ(inferior-lispプロセス)を終了して、再度起動しなおす必要がある。

参考URL:
'T: CREATE-SERVERしたSWANKに接続すると日本語の評価で切断してしまう
Common LISP users jp:SLIME

2012年3月18日日曜日

Ubuntuでclangを利用する

clangは、GCCを置き換えることを目的としたコンパイラフロント・エンド。AppleやGoogleなどの サポートを受け活発に開発が進められている。

GoogleではC++で記述されたコードベースのリファクタリングにclangを利用している という動画 Clang MapReduce – Automatic C++ Refactoring at Google Scaleを見て興味を持ったので clangを試してみる。

ubuntuでは、clangパッケージが存在するので、

apt-get install clang

で、必要なパッケージをインストール。

早速、Hello Worldをclangでコンパイル。

#include <iostream>

int main(int argc, char *argv[]) {
  std::cout << "Hello, world!" << std::endl;

  return 0;
}

clang HelloWorld.cpp

すると以下のようなエラー・メッセージが出てコンパイルに失敗。

/usr/bin/ld: /tmp/cc-sx9qR1.o: in function __cxx_global_var_init:HelloWorld.cpp(.text+0xc): error: undefined reference to 'std::ios_base::Init::~Init()'

/usr/bin/ld: /tmp/cc-sx9qR1.o: in function __cxx_global_var_init:HelloWorld.cpp(.text+0x30): error: undefined reference to 'std::ios_base::Init::Init()'
/usr/bin/ld: /tmp/cc-sx9qR1.o: in function main:HelloWorld.cpp(.text+0x65): error: undefined reference to 'std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'

/usr/bin/ld: /tmp/cc-sx9qR1.o: in function main:HelloWorld.cpp(.text+0x70): error: undefined reference to 'std::cout'
/usr/bin/ld: /tmp/cc-sx9qR1.o: in function main:HelloWorld.cpp(.text+0x99): error: undefined reference to 'std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'

/usr/bin/ld: /tmp/cc-sx9qR1.o: in function main:HelloWorld.cpp(.text+0xa5): error: undefined reference to 'std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))'

collect2: ld returned 1 exit status
clang: error: linker (via gcc) command failed with exit code 1 (use -v to see invocation)

エラー・メッセージに書かれているように-vオプションを指定して、コンパイルするも ビルド時のオプションが羅列されるだけで解決方法は見つからない。

ググってみると同じエラーに遭遇した人のブログを発見。

clangでc++を試して四苦八苦したメモ:筆者は病気シリーズ3

gccにC++ビルド用のコマンドg++があるのと同様に、clangにもC++ビルド用のclang++コマンドがあるらしい。 上記コードをclang++でビルドすると無事ビルドに成功。

無事にインストールとビルドができたので、しばらくclangで遊んでみよう。

あと、最新バージョンのclangをソースコードからビルドして試してみないと。

2012年3月7日水曜日